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

Why is gcc's option “-Wstrict-prototypes” not valid for C++?

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

1
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 and Objective-C only) Warn if a function is declared or defined without specifying the argument types. (An
old-style function definition is permitted without a warning if
preceded by a declaration which specifies the argument types.)

现在我只知道我忘记了一些有关C ++的明显知识,但是C ++是否也不需要为原型中的函数指定参数类型?的确,那些函数原型经常在类声明中,因为这些函数通常是成员函数,但是仍然不需要原型吗?或者即使他们只是一个很好的实践,那么为什么gcc不能通过此选项提供支持?或者,如果不是,则使用C ++的并行选项?


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

我在构建脚本中为小型示例/测试C或C ++程序设置了该选项,并且警告种类使我感到恼火-似乎没有理由仅因为某种语言的默认行为是我要警告的内容而发出警告。但是就在那儿,所以有一天,当它足够激怒我时,我将修复脚本以免打扰C ++构建的该选项。


它是C ++标准所必需的,因此没有打开或关闭它的含义:它始终在语言中处于打开状态。


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

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

1
2
3
4
5
6
void foo(x, y)
    int x;
    char *y;
{
    // ...
}

如果使用-Wstrict-prototypes进行编译,GCC会在C中为此提供警告。


另一个有趣的特殊情况:

1
extern int foo();

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

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