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

iezvtpos  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(129)

下面是我和网络上的许多人在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++的并行选项?

h43kikqp

h43kikqp1#

我想这是因为C需要严格的原型作为语言的一部分,所以这个选项是多余的。为什么这使得GCC需要抱怨它是超越我。
我在我的小样本/测试C或C
程序的构建脚本中设置了这个选项,这个警告有点让我恼火--似乎没有理由仅仅因为一种语言的默认行为是我所要求的就发出警告。但它确实存在,所以有一天当它让我恼火到极点时,我会修复我的脚本,不再为C++构建的这个选项而烦恼。

qjp7pelc

qjp7pelc2#

这是C++标准所要求的,因此打开或关闭它没有任何意义:在语言中,它是“永远”的。

wtzytmuj

wtzytmuj3#

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

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

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

kr98yfug

kr98yfug4#

另一个有趣的特例:

extern int foo();

根据C语义,这个声明为foo指定了一个不完整的类型,作为一个函数,其中参数的数量和类型保持未指定。然而,这是C99/C11中的一个 * 完全有效的 * 声明;但是,-Wstrict-prototypes会强制在C中对该有效声明发出警告。
根据C语义,这个声明为foo指定了一个complete类型,作为一个不带参数的函数(即,它等价于extern int foo(void))。因此,-Wstrict-prototypes在C中与这种情况无关。

相关问题