下面的代码片段在有点旧的编译器上添加-pedantic
和-Werror
时生成编译错误。
#include <cstdint>
#include <iostream>
int add(int a, int b){
return a + b;
}; // <-- stray semicolon
int main (){
return 0;
}
然而,这不会发生在较新的编译器版本中。请找到GCC(10.x和11.x)和Clang(5.x,6.x)的矩阵,以证明https://godbolt.org/z/KWeb8WTxz的差异。
我的问题分为两部分:
1.为什么在最近的编译器中没有触发这个?
1.是否可以在最近的Clang或GCC版本中启用旧行为?
1条答案
按热度按时间ukdjmx9f1#
从C++11开始,全局级别的额外声明
;
(也称为 empty-declarations)是有效的。我相信这对编写宏有时是有用的。因此,GCC 11在使用
-std=c++11
或更高版本时删除了-pedantic
诊断程序。请参阅:您可以使用比C11更早的C标准来恢复旧的行为。如果通过
-std=c++03
,GCC 11和clang 6都会发出旧的诊断。另外,GCC和Clang的最新版本都支持警告选项
-Wextra-semi
,该选项专门警告冗余的插件。感谢HolyBlackCat提到这一点。