Có ai biết cảnh báo rằng trình biên dịch C++ cung cấp trợ giúp đó để thực thi tính chính xác của const không? Ví dụ, nó sẽ được tốt đẹp để có một cảnh báo được sản xuất bởi bất kỳ phương pháp C++ có chứa một tham số không const mà không bao giờ sửa đổi bên trong của phương pháp. Tôi thấy rằng có một cảnh báo trình biên dịch gnu được gọi là -Wsuggest-attribute = const; tuy nhiên, khi tôi sử dụng lá cờ này tôi nhận được một lỗi nói rằng nó không được công nhận. Bất kỳ ý tưởng tại sao?Const cảnh báo chính xác C++
Trả lời
Tôi không nghĩ rằng một cảnh báo như vậy tồn tại, chủ yếu là vì nó sẽ là vô ích. Chỉ vì một tham số không được sửa đổi bên trong cuộc gọi, không có nghĩa là nó phải được thực hiện const
chỉ vì lợi ích của nó.
Hãy suy nghĩ về các chức năng virtual
. Có lẽ nhà thiết kế của lớp cơ sở, mặc dù không sửa đổi tham số trong lớp cơ sở, muốn để nó lên đến một lớp mở rộng có hay không sửa đổi tham số đó.
Ngoài ra, hãy nghĩ đến các ứng dụng lớn, nơi sửa đổi giao diện hoặc API hoặc bất kỳ chi phí nào nhiều. Bạn có thể không cần sửa đổi tham số ngay bây giờ, nhưng có ý định làm như vậy trong tương lai. Bạn sẽ không biến nó thành const
ngay bây giờ và bắt buộc xây dựng lại toàn bộ và có thể có lỗi trong tương lai khi bạn xóa const
.
Tôi thấy quan điểm của bạn; tuy nhiên, tôi vẫn nghĩ rằng điều này sẽ hữu ích như một cảnh báo (có lẽ không phải là một lỗi). Hơn nữa, có vẻ như có một lá cờ cho trình biên dịch gnu được gọi là -Wsuggest-attribute = const; nhưng trình biên dịch g ++ của tôi không nhận ra nó. – user809409
Không phải là một tính năng mà tôi sẽ không bao giờ để chạy trên trình biên dịch, nhưng sẽ tốt hơn khi bật mọi lúc và sau đó để xem xét các đề xuất. Nếu bạn biết một hàm sẽ không sửa đổi một biến, đó là một thực hành tốt để làm cho nó const vì nó cho phép các biến const được truyền vào. – Darinth
[Rust] (https://www.rust-lang.org/en -US /) có tính năng này (không cần thiết 'mut'), và nó là một cái gì đó tôi nhớ trở lại C + + và cố gắng để đảm bảo các API và biến địa phương là bất biến theo mặc định. – phoenix
Không, rất tiếc, không có cảnh báo nào như vậy. Bạn chỉ nhận được lỗi nếu bạn cố gắng thay đổi các tham số được khai báo const. Điều này là do thiếu các khai báo const
không thay đổi độ chính xác của mã từ quan điểm trình biên dịch. Nhưng const chính xác là quan trọng cho trình biên dịch để khám phá tối ưu tiềm năng và nó cải thiện khả năng đọc của mã. Đó là vấn đề chuyên nghiệp. Đặc biệt là khi sử dụng tài liệu tham khảo const đúng đắn là phải. I often refer to this.
Trình biên dịch tự nó có độ chính xác rất cao khi các toán tử (gán, chuyển đổi, ...) đi vào hoạt động. Một thiếu const
ở đây và trình biên dịch từ chối sử dụng toán tử vì nó tạo ra sự khác biệt lớn nếu tham số đã cho có thể được sửa đổi hay không.
cẩn thận, một tham số const
như thế này:
void myFunc(int const param);
không không thuộc về giao diện. Nó thuộc về phạm vi địa phương của hàm thực hiện. Trong thực tế, chức năng này:
int inc(int const param) { return param+1; }
có thể được khai báo là
int inc(int param);
Nó không phải là một sự vi phạm của các mô hình đúng đắn const để đòi quyền sửa đổi một biến nhưng không thực sự làm điều đó.
Nếu bạn lo lắng về const_cast
, bạn không thể sử dụng nó ngay từ đầu hoặc chỉ đơn giản là grep
cho nó trong cơ sở mã của bạn.
Tôi không biết các cảnh báo như vậy và tôi nghĩ rằng chúng sẽ khó thực hiện trong trình biên dịch - tức là chúng sẽ làm chậm nó xuống. Có lẽ một số công cụ phân tích tĩnh có các tính năng như vậy (nhưng tôi cũng không biết về các tính năng này).
Theo Wsuggest-attribute=const
, đó là một điều khác. Nó sẽ gợi ý sử dụng thuộc tính function "const
" gcc, về cơ bản, một hàm toán học, chỉ nhận các giá trị (không có con trỏ), không đọc hoặc thay đổi trạng thái tĩnh/toàn cục và chỉ trả về một giá trị (không có con trỏ) .Đối với mô tả thêm, nhìn ở đây: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
-Wsuggest-attribute=const
Phân tích này đòi hỏi phải lựa chọn
-fipa-pure-const
được kích hoạt theo mặc định ở
-O
và cao hơn
- 1. Trình biên dịch không cảnh báo về mất chính xác?
- 2. Cách nhận cảnh báo về định dạng chuỗi không chính xác (C++)
- 3. C + + Const khai báo con trỏ
- 4. C# Compiler Cảnh báo 1685
- 5. C cảnh báo tiềm ẩn cảnh báo chức năng 'thoát'
- 6. Tránh cảnh báo 'chính Parameter unreferenced'
- 7. C++ Boost: nguyên nhân của cảnh báo này là gì?
- 8. const tính chính xác cho cấu trúc với con trỏ
- 9. Cách xác định cảnh báo trong bảng phân cảnh Xcode?
- 10. Cảnh báo "Chuyển đổi ngầm định mất độ chính xác nguyên ..."
- 11. Cảnh báo: mysqli_error() dự đoán chính xác 1 tham số, 0 lỗi cho
- 12. Loại bỏ flash cảnh báo giao meta-chính sách
- 13. C: Gán "static const char * const" thành "const tĩnh char *"
- 14. Tại sao tôi không thể chuyển đổi 'char **' thành 'const char * const *' trong C?
- 15. const trong khai báo hàm
- 16. khai báo một mảng const int trong C++
- 17. C# cách xử lý chính xác SmtpClient?
- 18. Cảnh báo vô hiệu hóa C#
- 19. C++ cảnh báo giải quyết istream :: tellg
- 20. C++ cảnh báo không phải POD để chuyển một chuỗi?
- 21. Loại bỏ thông báo cảnh báo C trong R
- 22. Cảnh báo cảnh báo AVCam thấp
- 23. Cách chính xác để khai báo/xác định đối tượng cout tùy chỉnh giống như
- 24. C++ vs Python chính xác
- 25. Tìm nút chính xác C#
- 26. C++: Ý nghĩa của const char * const *
- 27. Tham chiếuGỗi: "cảnh báo" không được xác định
- 28. Ngăn nút Back hiển thị cảnh báo xác nhận POST
- 29. Khai báo con trỏ const thành int?
- 30. Tắt cảnh báo cảnh báo không an toàn mysql
"đúng đắn const" không thực sự có nhiều việc phải làm với các đối số phương thức hoặc các biến cục bộ. cppcheck có thể phát ra các cảnh báo kiểu trên các phương thức lớp mà có thể được tạo thành const. –
'-Wsuggest-attribute' là về các thuộc tính hàm GCC cụ thể, không phải về tính chính xác của const. '__attribute __ ((const))' có phần tương tự như 'constexpr'. – Philipp