警告文本非常清楚:“C++”不在集合[艾达/c/Objc]中,所以我根本不知道为什么GCC在编译C++代码时给出了这个警告。(FYA)尽管有C++代码,我们打开这个标志的原因是因为它主要是C代码,我们选择了一个严格的(高级别)警告选项列表,但是我们添加了一个C++代码。 我的问题是:为什么这个警告对C++是有效的?,c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings" /> 警告文本非常清楚:“C++”不在集合[艾达/c/Objc]中,所以我根本不知道为什么GCC在编译C++代码时给出了这个警告。(FYA)尽管有C++代码,我们打开这个标志的原因是因为它主要是C代码,我们选择了一个严格的(高级别)警告选项列表,但是我们添加了一个C++代码。 我的问题是:为什么这个警告对C++是有效的?,c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings" />

为什么gcc';s选项“-Wstrict原型;对C+无效+;? 这里是一个警告,我和很多人在网上,看看在C++代码上运行GCC时: cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ >警告文本非常清楚:“C++”不在集合[艾达/c/Objc]中,所以我根本不知道为什么GCC在编译C++代码时给出了这个警告。(FYA)尽管有C++代码,我们打开这个标志的原因是因为它主要是C代码,我们选择了一个严格的(高级别)警告选项列表,但是我们添加了一个C++代码。 我的问题是:为什么这个警告对C++是有效的?

为什么gcc';s选项“-Wstrict原型;对C+无效+;? 这里是一个警告,我和很多人在网上,看看在C++代码上运行GCC时: cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ >警告文本非常清楚:“C++”不在集合[艾达/c/Objc]中,所以我根本不知道为什么GCC在编译C++代码时给出了这个警告。(FYA)尽管有C++代码,我们打开这个标志的原因是因为它主要是C代码,我们选择了一个严格的(高级别)警告选项列表,但是我们添加了一个C++代码。 我的问题是:为什么这个警告对C++是有效的?,c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings,警告选项的gcc文档来自: -Wstrict原型(仅限C和Objective-C)在未指定参数类型的情况下声明或定义函数时发出警告 如果出现以下情况,则允许在没有警告的情况下使用旧式函数定义 前面带有指定参数类型的声明。) 现在我知道我忘记了一些关于C++的明显的东西,但是C++也不需要为原型中的函数指定参数类型吗?真的,那些函数原型通常在类声明中,因为函数通常是成员函数,但不是原型还是需要的吗?或者即使它们只是好的实践,C++ C++ C++?< /p> < p>它是隐式的C++,因为声明/定

警告选项的gcc文档来自:

-Wstrict原型(仅限C和Objective-C)在未指定参数类型的情况下声明或定义函数时发出警告 如果出现以下情况,则允许在没有警告的情况下使用旧式函数定义 前面带有指定参数类型的声明。)


<>现在我知道我忘记了一些关于C++的明显的东西,但是C++也不需要为原型中的函数指定参数类型吗?真的,那些函数原型通常在类声明中,因为函数通常是成员函数,但不是原型还是需要的吗?或者即使它们只是好的实践,C++ C++ C++?< /p> < p>它是隐式的C++,因为声明/定义函数而不指定参数类型是非法C++的标准(是的,这是C和C++之间的区别之一,这使得C++不是真正的超集)。 这是合法的C99,但不是合法的C++03:

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

<> GCC在C中用C++编写了一个警告,如果用<代码> -WrRead原型 >

< P>我想它是因为C++需要严格的原型作为语言的一部分,所以这个选项是多余的。为什么这使得GCC需要抱怨它超出了我的范围。
我在小脚本/测试C或C++程序的构建脚本中设置了这个选项,警告的方式刺激了我,似乎没有理由警告,只是因为语言的默认行为是我所要求的。但是它在那里,所以有一天它刺激我时,我会修复我的脚本,不去麻烦C的那个选项。++Buff.< /P> < P>这是C++标准所要求的,所以没有打开或关闭的意义:它总是在语言中。

< P>另一个有趣的特殊情况:

extern int foo(); 
根据C语义,此声明为foo指定了一个不完整的类型,其中参数的数量和类型仍然未指定。这在C99/C11中是完全合法的,但是-Wstrict prototype在C中对此声明发出警告


通过C++语义,该声明指定了FO的<强>完整< /强>类型,作为不带参数的函数(即等效于<代码> EXT INTO FO(空隙)< /代码>)因此,在C++中,W-Ru本原型与此情况无关。

因此,C++的警告是多余的,因为如果违反C++代码中的要求,编译器将正确地报告错误(并且失败编译)。是的,因为你提到的原因,在C++中警告丢失原型是多余的。就我而言,对于C++使用的 > WRADE原型的GCC警告也是多余的;GCC可以默默地忽略C++的选项。