【问题标题】:Why is gcc's option "-Wstrict-prototypes" not valid for C++?为什么 gcc 的选项“-Wstrict-prototypes”对 C++ 无效?
【发布时间】:2011-07-14 21:00:19
【问题描述】:

这是一个警告,我和网上的很多人,在 C++ 代码上运行 gcc 时查看:

cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++

警告文本非常清楚:'C++' 不在集合 [Ada/C/ObjC] 中,所以我完全不知道为什么 gcc 在编译 C++ 代码时会发出此警告。 (仅供参考,尽管有 C++ 代码,我们仍打开此标志的原因是因为它主要是 C 代码,我们选择了严格(高级)警告选项列表,但我们添加了一些 C++ 代码。

我的问题是:为什么这个警告对 C++ 无效?

来自http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Warning-Options.html 的警告选项的 gcc 文档是:

-Wstrict-prototypes(仅限 C 和 Objective-C)如果在声明或定义函数时未指定参数类型,则发出警告。 (一个 允许旧式函数定义而不发出警告,如果 前面有一个指定参数类型的声明。)

现在我只是知道我忘记了一些关于 C++ 的明显内容,但 C++ 是否也不需要为原型中的函数指定参数类型?确实,这些函数原型通常在类声明中,因为这些函数通常是成员函数,但原型不是必需的吗?或者即使它们只是很好的做法,那么为什么 gcc 不通过​​这个选项提供支持呢?或者如果没有,通过 C++ 的并行选项?

【问题讨论】:

    标签: c++ gcc compiler-warnings


    【解决方案1】:

    我想这是因为 C++ 需要严格的原型作为语言的一部分,所以这个选项是多余的。为什么这使得 GCC 需要抱怨它超出了我的范围。

    我在我的构建脚本中为小型示例/测试 C 或 C++ 程序设置了该选项,并且这种警告让我很恼火 - 似乎没有理由仅仅因为语言的默认行为就是我的行为而发出警告我要求。但它就在那里,所以有一天当它让我很恼火时,我会修复我的脚本,以免为 C++ 构建的那个选项而烦恼。

    【讨论】:

    • 所以 warning 对于 C++ 来说是多余的,因为如果我违反了 C++ 代码中的要求,编译器将正确报告 error(并失败编译)?
    • 是的,由于您提到的原因,在 C++ 中缺少原型的警告是多余的。就我而言,与 C++ 一起使用的-Wstrict-prototypes 的警告 GCC 问题也是多余的;就我而言,gcc 可以默默地忽略 C++ 的选项..
    【解决方案2】:

    它是 C++ 标准所要求的,因此打开或关闭它没有任何意义:在语言中它始终打开

    【讨论】:

      【解决方案3】:

      它在 C++ 中是隐含的,因为根据标准声明/定义函数而不指定参数类型是非法的 C++(是的,这是 C 和 C++ 之间的差异之一,这使得 C++ 不是真正的超集)。

      这是合法的 C99,但不是合法的 C++03:

      void foo(x, y)
          int x;
          char *y;
      {
          // ...
      }
      

      如果使用 -Wstrict-prototypes 编译,GCC 会在 C 中给出警告。

      【讨论】:

        【解决方案4】:

        另一个有趣的特殊情况:

        extern int foo(); 
        

        根据 C 语义,此声明为 foo 指定了一个 incomplete 类型,其中参数的数量和类型仍未指定。这在 C99/C11 中是完全合法的,但 -Wstrict-prototypes 会针对 C 中的此声明发出警告。

        根据 C++ 语义,该声明为 foo 指定了一个 complete 类型,作为一个不带参数的函数(即它等同于 extern int foo(void))。因此 -Wstrict-prototypes 与 C++ 中的这种情况无关。

        【讨论】:

          猜你喜欢
          • 2011-12-27
          • 2015-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多