为什么 gcc 的选项"-Wstrict-prototypes"对C++无效?
Why is gcc's option "-Wstrict-prototypes" not valid for C++?
这里有一个警告,我和很多人在网上看到,当在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
与这种情况无关。
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 数组下标的类型"float*[float]"无效
- 修改 std::vector 会使迭代器无效吗?