5

Khi cố gắng để in các đối số dòng lệnh đầu tiên:Làm thế nào để tránh con trỏ số học khi sử dụng char ** argv

std::cout << argv[0] << std::endl; 

kêu vang-gọn gàng cung cấp cho các cảnh báo:

cảnh báo: 'không sử dụng con trỏ số học' từ [cppcoreguidelines-pro-giới hạn-con trỏ số học]

có một cách khác để sử dụng các giá trị của argv mà không sử dụng số học con trỏ? Không truy cập một char** bởi bất kỳ phương pháp hợp lý nào sẽ phải sử dụng số học con trỏ?

Tôi đánh giá cao có một số chức năng chuyên biệt để xử lý các đối số dòng lệnh, nhưng chúng dường như quá nặng để chỉ in một đối số.

Tôi đang viết bằng c++, sử dụng trình biên dịch clang và xây dựng với cmake.

+2

Nếu bạn chỉ cần 'argv [0]', bạn có thể sử dụng '* argv'. Nhưng ngoài ra, không. –

+0

Thử sử dụng '& argv [0]'. Tôi tin rằng 'cout' muốn một con trỏ đến một ký tự đơn. –

+0

Liệu nó có còn phàn nàn nếu bạn làm 'argv' một mảng chứ không phải là một con trỏ? 'char * argv []'? – spectras

Trả lời

5

Từ clang-tidy - cppcoreguidelines-pro-bounds-pointer-arithmetic:

Pointers chỉ nên tham khảo đối tượng duy nhất, và con trỏ số học là mong manh và dễ dàng để có được sai. span<T> là loại an toàn được kiểm tra giới hạn để truy cập mảng dữ liệu.

Vì vậy, có:

Có một cách khác để sử dụng các giá trị của argv mà không sử dụng con trỏ số học? Không truy cập một char ** bởi bất kỳ phương pháp hợp lý sẽ phải sử dụng số học con trỏ?

Bạn hoàn toàn chính xác. Tuy nhiên, hướng dẫn là ẩn số học con trỏ đó, cho phép một lớp trợ giúp kiểm tra trước khi thực hiện phép tính số học. Bạn có thể tạo một số span<char*> từ argvargc.

+0

Vấn đề với 'span', tuy nhiên, là nó được giới hạn kiểm tra. Tôi ghét các thùng chứa được kiểm tra giới hạn. – SergeyA

+0

@SergeyA Nghe có vẻ như bạn về cơ bản không đồng ý với hướng dẫn. Đó là hoàn toàn công bằng, và trong trường hợp đó, không bật cảnh báo đó. – hvd

+0

Tôi đồng ý với phần lớn trong số họ, nhưng quy tắc cụ thể này tôi thấy tồi tệ. Một nhánh trên mọi truy cập không phải là thứ tôi từng muốn trong mã của mình. – SergeyA

Các vấn đề liên quan