2011-07-14 22 views
6

这里是一个警告,我和很多人在那里在网络上,看到C++代码运行GCC时:为什么gcc的选项“-Wstrict-prototypes”对C++无效?

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

的警告文字是很清楚的:“C++”是不是在集合[阿达/ C/ObjC],所以我毫不怀疑gcc为什么在编译C++代码时给出这个警告。 (仅供参考,尽管使用C++代码打开此标志的原因是因为它主要是C代码,但我们选择了严格的(高级别)警告选项列表,但我们添加了一些C++代码。

我的问题是:为什么不是这样的警告适用于C++

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

-Wstrict的原型(C和Objective-C只)如果函数被声明或定义而没有指定参数类型,则会发出警告( 旧样式函数定义在没有警告的情况下被允许,如果 的声明指定的参数类型之前。)

现在我只知道我忘了什么东西显然对C++的,但不C++还需要在原型指定参数类型的功能呢?诚然,这些函数原型通常在类声明中,因为函数通常是成员函数,但是不是原型还是需要的?或者即使他们只是良好的做法,那么为什么gcc不会提供这个选项的支持?或者,如果没有,通过C++的并行选项?

回答

8

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

我在我的构建脚本中为小样本/测试C或C++程序设置了该选项,并且警告类型刺激了我 - 似乎没有理由警告,因为语言的默认行为是我要求。但是它就在那里,所以有一天当它激怒我时,我会修复我的脚本,以免打扰C++构建的这个选项。

+1

所以_warning_对于C++来说是多余的,因为如果我违反了C++代码中的要求,编译器会正确地报告_error_(并且编译失败)? – talkaboutquality

+0

是的,因为你提到的原因,在C++中对于缺少原型的警告是多余的。就我而言,用于C++的'-Wstrict-prototypes'的GCC警告问题也是多余的;就我而言,gcc可以默默地忽略C++的选项。 –

3

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

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

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

GCC给出了下这是一个警告,如果有-Wstrict-prototypes编译。

3

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

0

另一个有趣的特殊情况:

extern int foo(); 

采用C语义该声明指定的不完整类型FOO,其中的参数的数量和类型仍然是不确定的。 C99/C11完全合法,但-Wstrict-prototypes在C中对此声明发出警告。

通过C++语义,该声明为foo指定了一个完整类型,作为不带任何参数的函数(即它相当于extern int foo(void))。因此-Wstrict-prototypes与C++中的这种情况无关。