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