有没有人知道C++编译器提供的任何警告,可以帮助强制实施const正确性?例如,如果任何C++方法包含一个从未在方法内修改的非const参数,那么产生一个警告会很好。我看到有一个名为-Wsuggest-attribute = const的gnu编译器警告;但是,当我使用此标志时,我收到一个错误,说它无法识别。有什么想法吗?
有没有人知道C++编译器提供的任何警告,可以帮助强制实施const正确性?例如,如果任何C++方法包含一个从未在方法内修改的非const参数,那么产生一个警告会很好。我看到有一个名为-Wsuggest-attribute = const的gnu编译器警告;但是,当我使用此标志时,我收到一个错误,说它无法识别。有什么想法吗?
-Wsuggest-attribute=const
-fipa-pure-const
这默认情况下是启用的。
-O
并且更高
const
。const
,并强制进行完整的重建,可能还会在未来删除const
时出现错误。注意,像这样的const
参数:
void myFunc(int const param);
不属于接口。它属于函数实现的本地范围。实际上,这个函数:
int inc(int const param) { return param+1; }
可以声明为
int inc(int param);
坚持const正确性范式,并不意味着禁止声称有修改变量的权利,但事实上并没有执行。
如果您担心const_cast,可以选择从一开始就不使用它,或者直接在代码库中搜索grep。
我不知道有这样的警告,而且我认为在编译器中实现它们会相当困难 - 也就是说,它们会减慢编译速度。也许一些静态分析工具有这样的功能(但我也不知道)。
至于Wsuggest-attribute=const
,那是另一回事。它将建议使用gcc特定的“函数属性const
”,基本上是一个数学函数,仅接收值(没有指针),不读取或更改任何静态/全局状态,并仅返回一个值(没有指针)。有关进一步描述,请参见此处:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
很遗憾,没有这样的警告。如果您尝试更改已声明为const的参数,则只会出现错误。这是因为缺少const
声明不会从编译器的角度改变代码的正确性。但是,对于编译器发现潜在优化并提高代码可读性而言,const正确性非常重要。这是一种专业精神。特别是在使用引用时,const正确性是必须的。我经常参考这个链接。
当运算符(赋值、转换等)进入时,编译器本身非常严格地处理const正确性。如果这里缺少const
,编译器将拒绝使用运算符,因为给定的参数是否可能被修改会产生很大的差异。