2012-04-14 23 views
20

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++

+0

"đú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. –

+0

'-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

Trả lời

6

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.

+2

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

+0

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

+0

[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

0

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.

5

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.

0

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

0
-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

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