Const正确性警告c ++

时间:2012-04-14 19:31:16

标签: c++ const compiler-warnings

有没有人知道C ++编译器提供的有助于强制执行const正确性的任何警告?例如,任何包含非const参数的C ++方法产生的警告会很好,该参数在方法内部永远不会被修改。我看到有一个名为-Wsuggest-attribute = const的gnu编译器警告;但是,当我使用此标志时,我收到一条错误消息,表示无法识别。有什么想法吗?

5 个答案:

答案 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