C++ 常量正确性警告

问题描述 投票:0回答:5
有谁知道 C++ 编译器提供的任何有助于强制 const 正确性的警告吗?例如,如果任何包含从未在方法内部修改的非常量参数的 C++ 方法生成警告,那就太好了。我看到有一个名为 -Wsuggest-attribute=const; 的 gnu 编译器警告;但是,当我使用此标志时,我收到一条错误消息,指出它无法识别。有什么想法吗?

c++ constants compiler-warnings
5个回答
6
投票
-Wsuggest-attribute=const

此分析需要选项

-fipa-pure-const

默认启用

-O

及更高


5
投票
我认为这样的警告不存在,主要是因为它没有用。仅仅因为参数在调用内部没有被修改,并不意味着应该仅仅为了它而将其设置为

const

想想

virtual

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

此外,考虑一下大型应用程序,其中修改接口或 API 或其他任何内容的成本很高。您现在可能不需要修改该参数,但打算将来这样做。您现在不会成功

const

,并强制完全重建,并且在将来删除 
const
 时可能会面临错误的风险。


5
投票
小心,像这样的

const

参数:

void myFunc(int const param);

是否

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

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

可以声明为

int inc(int param);

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

如果您担心

const_cast

,您可以首先不使用它,或者只是在代码库中使用 
grep


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

根据

Wsuggest-attribute=const

,这是另一回事。它将建议使用 gcc 特定的“函数属性 
const
”,它基本上是一个数学函数,仅接收值(无指针),不读取或更改任何静态/全局状态并仅返回一个值(无指针)指针)。有关更多说明,请查看此处:
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes


0
投票
不,不幸的是没有这样的警告。如果您尝试更改 const 声明的参数,您只会收到错误。这是因为从编译器的角度来看,缺少

const

 声明不会改变代码的正确性。但是 const 正确性对于编译器发现潜在的优化非常重要,并且它提高了代码的可读性。这是专业精神的问题。特别是在使用引用 const 时,正确性是必须的。 
我经常提到这个。 当运算符(赋值、转换等)发挥作用时,编译器本身非常重视 const 的正确性。这里缺少
const
,编译器拒绝使用该运算符,因为如果给定的参数可能被修改或不被修改,它会产生很大的差异。

© www.soinside.com 2019 - 2024. All rights reserved.