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

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

本文关键字:C++ 无效 -Wstrict-prototypes 选项 为什么 gcc      更新时间:2023-10-16

这里有一个警告,我和很多人在网上看到,当在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文档是:

- strict-prototypes(仅限C和Objective-C)如果没有指定参数类型就声明或定义函数,则发出警告。(一个允许在没有警告的情况下定义旧式函数前面有一个指定参数类型的声明。)

现在我只是知道我忘记了c++的一些明显的东西,但是c++不也要求在原型中为函数指定参数类型吗?确实,这些函数原型通常在类声明中,因为函数通常是成员函数,但原型不是仍然需要的吗?或者,即使它们只是很好的实践,为什么gcc不通过这个选项提供支持呢?或者如果没有,通过c++的并行选项?

我想这是因为c++需要严格的原型作为语言的一部分,所以这个选项是多余的。我不明白为什么GCC要抱怨它。

我在我的构建脚本中为小样本/测试C或c++程序设置了该选项,并且警告类型激怒了我-似乎没有理由仅仅因为语言的默认行为是我所要求的。但是它就在那里,所以有一天当它让我足够恼火的时候,我会修复我的脚本,使其不再为c++构建而烦恼。

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

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

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

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

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

另一个有趣的特例:

extern int foo(); 

根据C语义,此声明为foo指定了不完整类型,作为未指定参数数量和类型的函数。然而,在C99/C11中,这是一个完全有效的声明;然而,-Wstrict-prototypes对c中的有效声明强制发出警告。

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