这是一个警告我,网上有很多人,看看在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 ++的并行选项?
答案 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与此案例无关。