【问题标题】:Const correctness warnings c++const 正确性警告 c++
【发布时间】:2016-02-08 18:49:58
【问题描述】:

有谁知道 C++ 编译器提供的任何有助于强制执行 const 正确性的警告?例如,如果任何 C++ 方法包含一个从未在方法内部修改过的非常量参数,就会产生警告。我看到有一个名为 -Wsuggest-attribute=const; 的 gnu 编译器警告。但是,当我使用此标志时,我收到一条错误消息,指出它无法识别。任何想法为什么?

【问题讨论】:

  • “const 正确性”实际上与方法参数或局部变量没有太大关系。 cppcheck 可以在类方法上发出样式警告,也可以将其设为 const。
  • -Wsuggest-attribute 是关于 GCC 特定的函数属性,而不是关于 const 正确性。 __attribute__((const)) 有点类似于 constexpr。

标签: c++ constants compiler-warnings


【解决方案1】:

我认为不存在这样的警告,主要是因为它没有用。仅仅因为一个参数没有在调用内部被修改,并不意味着它应该被设为const。

想想virtual 函数。或许基类的设计者,虽然没有修改基类中的参数,但希望让扩展类来决定是否修改该参数。

另外,想想大型应用程序,其中修改接口或 API 或任何成本很高。您现在可能不需要修改参数,但打算在将来这样做。您现在不会创建const,并强制完全重建,并且将来删除const 时可能会出现错误。

【讨论】:

  • 我明白你的意思;但是,我仍然认为这将作为警告有用(也许不是错误)。此外,gnu 编译器似乎有一个名为 -Wsuggest-attribute=const; 的标志。但我的 g++ 编译器无法识别它。
  • 这不是一个我永远不会在编译器上运行的功能,但不时打开它来查看建议会很好。如果您知道函数不会修改变量,最好将其设为 const,因为它允许传入 const 变量。
  • Rust 具有此功能(不必要的mut),我怀念回到 C++ 并尝试确保 API 和局部变量默认不可变的东西。
【解决方案2】:
-Wsuggest-attribute=const

此分析需要选项

-fipa-pure-const

默认在

启用
-O 

及以上

【讨论】:

    【解决方案3】:

    小心,像这样一个const参数:

    void myFunc(int const param);
    

    不是否属于接口。它属于函数实现的本地范围。其实这个函数:

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

    可以声明为

    int inc(int param);
    

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

    如果您担心const_cast,您可以一开始就不要使用它,或者在您的代码库中直接使用grep。

    【讨论】:

      【解决方案4】:

      没有,很遗憾没有这样的警告。如果您尝试更改 const 声明的参数,您只会得到错误。这是因为从编译器的角度来看,缺少 const 声明不会改变代码的正确性。但是 const 正确性对于编译器发现潜在的优化很重要,它提高了代码的可读性。这是专业的问题。尤其是在使用引用时,const 正确性是必须的。 I often refer to this.
      当运算符(赋值,转换,...​​)发挥作用时,编译器本身非常重视 const 正确性。这里缺少const,编译器拒绝使用该运算符,因为如果给定的参数可能被修改,这会产生很大的不同。

      【讨论】:

        【解决方案5】:

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

        根据Wsuggest-attribute=const,这是另一回事。它将建议使用特定于 gcc 的“函数属性const”,它基本上是一个数学函数,只接收值(没有指针),不读取或更改任何静态/全局状态并且只返回一个值(没有指针)。更多描述请看这里:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          相关资源
          最近更新 更多