为什么gcc的选项“-Wstrict-prototypes”对C ++无效?

时间:2011-07-14 21:00:19

标签: c++ gcc compiler-warnings

这是一个警告我,网上有很多人,看看在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 ++的并行选项?

4 个答案:

答案 0 :(得分:9)

我认为这是因为C ++需要严格的原型作为语言的一部分,所以选项是多余的。为什么这样做让GCC需要抱怨它就超出了我。

我在我的构建脚本中为小样本/测试C或C ++程序设置了该选项,并且警告类型让我感到恼火 - 似乎没有理由警告,因为语言的默认行为就是我'我要求。但它就在那里,所以有一天,当它让我感到非常恼火时,我会修复我的脚本,而不用担心C ++版本的选项。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:3)

这是C ++标准所要求的,所以没有打开或关闭它的意义:它总是在语言中

答案 3 :(得分:0)

另一个有趣的特例:

extern int foo(); 

通过C语义,此声明为foo指定了不完整类型,其中参数的数量和类型仍然未指定。 C99 / C11完全合法,但是-Wstrict-prototypes在C中发出此声明的警告。

通过C ++语义,此声明为foo指定完整类型,作为不带参数的函数(即它等同于extern int foo(void))。因此,在C ++中,-Wstrict-prototypes与此案例无关。