有谁知道 C++ 编译器提供的任何有助于强制执行 const 正确性的警告?例如,如果任何 C++ 方法包含一个从未在方法内部修改过的非常量参数,就会产生警告。我看到有一个名为 -Wsuggest-attribute=const; 的 gnu 编译器警告。但是,当我使用此标志时,我收到一条错误消息,指出它无法识别。任何想法为什么?
5 回答
我不认为这样的警告存在,主要是因为它没有用。仅仅因为一个参数没有在调用内部被修改,并不意味着它应该const
仅仅为了它而被修改。
想想virtual
函数。也许基类的设计者虽然没有修改基类中的参数,但希望将是否修改该参数留给扩展类。
此外,想想大型应用程序,其中修改接口或 API 或任何成本很高。您现在可能不需要修改参数,但打算在将来这样做。您现在不会成功const
,并且强制完全重建,并且将来删除const
.
-Wsuggest-attribute=const
此分析需要选项
-fipa-pure-const
默认情况下启用
-O
及更高
小心,const
像这样的参数:
void myFunc(int const param);
不属于接口。它属于函数实现的本地范围。其实这个函数:
int inc(int const param) { return param+1; }
可以声明为
int inc(int param);
声称有权修改变量但实际上并未这样做并不违反 const 正确性范式。
如果您担心const_cast
一开始就不能使用它,或者只是grep
在您的代码库中使用它。
不,不幸的是没有这样的警告。如果您尝试更改 const 声明的参数,您只会得到错误。这是因为从编译器的角度来看,缺少const
声明不会改变代码的正确性。但是 const 正确性对于编译器发现潜在的优化很重要,它提高了代码的可读性。这是专业的问题。尤其是在使用引用时,const 正确性是必须的。我经常提到这个。
当运算符(赋值,转换,...)发挥作用时,编译器本身非常重视 const 正确性。此处缺少const
并且编译器拒绝使用该运算符,因为如果给定的参数可能被修改,它会产生很大的不同。
我不知道这样的警告,我认为它们很难在编译器中实现——也就是说,它们会减慢它的速度。也许一些静态分析工具具有这样的特性(但我也不知道这些特性)。
根据Wsuggest-attribute=const
,那是另一回事。它将建议使用特定于 gcc 的“函数属性const
”,它基本上是一个数学函数,只接收值(无指针),不读取或更改任何静态/全局状态并且只返回一个值(无指针)。有关进一步的描述,请看这里:https ://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes