25

有谁知道 C++ 编译器提供的任何有助于强制执行 const 正确性的警告?例如,如果任何 C++ 方法包含一个从未在方法内部修改过的非常量参数,就会产生警告。我看到有一个名为 -Wsuggest-attribute=const; 的 gnu 编译器警告。但是,当我使用此标志时,我收到一条错误消息,指出它无法识别。任何想法为什么?

4

5 回答 5

5

我不认为这样的警告存在,主要是因为它没有用。仅仅因为一个参数没有在调用内部被修改,并不意味着它应该const仅仅为了它而被修改。

想想virtual函数。也许基类的设计者虽然没有修改基类中的参数,但希望将是否修改该参数留给扩展类。

此外,想想大型应用程序,其中修改接口或 API 或任何成本很高。您现在可能不需要修改参数,但打算在将来这样做。您现在不会成功const,并且强制完全重建,并且将来删除const.

于 2012-04-14T19:33:30.433 回答
5
-Wsuggest-attribute=const

此分析需要选项

-fipa-pure-const

默认情况下启用

-O 

及更高

于 2016-02-08T10:49:58.940 回答
4

小心,const像这样的参数:

void myFunc(int const param);

属于接口。它属于函数实现的本地范围。其实这个函数:

int inc(int const param) { return param+1; }

可以声明为

int inc(int param);

声称有权修改变量但实际上并未这样做并不违反 const 正确性范式。

如果您担心const_cast一开始就不能使用它,或者只是grep在您的代码库中使用它。

于 2012-04-14T20:03:00.407 回答
0

不,不幸的是没有这样的警告。如果您尝试更改 const 声明的参数,您只会得到错误。这是因为从编译器的角度来看,缺少const声明不会改变代码的正确性。但是 const 正确性对于编译器发现潜在的优化很重要,它提高了代码的可读性。这是专业的问题。尤其是在使用引用时,const 正确性是必须的。我经常提到这个。
当运算符(赋值,转换,...​​)发挥作用时,编译器本身非常重视 const 正确性。此处缺少const并且编译器拒绝使用该运算符,因为如果给定的参数可能被修改,它会产生很大的不同。

于 2012-04-14T19:57:37.613 回答
0

我不知道这样的警告,我认为它们很难在编译器中实现——也就是说,它们会减慢它的速度。也许一些静态分析工具具有这样的特性(但我也不知道这些特性)。

根据Wsuggest-attribute=const,那是另一回事。它将建议使用特定于 gcc 的“函数属性const”,它基本上是一个数学函数,只接收值(无指针),不读取或更改任何静态/全局状态并且只返回一个值(无指针)。有关进一步的描述,请看这里:https ://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

于 2016-02-02T20:22:41.397 回答