以下代码片段在添加-pedantic
和-Werror
有点旧的编译器上生成编译错误。
#include <cstdint>
#include <iostream>
int add(int a, int b){
return a + b;
}; // <-- stray semicolon
int main (){
return 0;
}
然而,较新的编译器版本不会发生这种情况。请在https://godbolt.org/z/KWeb8WTxzgcc
上找到(10.x, 11.x) 和(5.x, 6.x)的矩阵clang
来演示差异。
我的问题有两个部分:
- 为什么在最近的编译器中没有触发这个?
- 是否可以在
clang
或的最新版本中启用旧行为gcc
?
从 C++11 开始,全局级别的额外分号
;
(也称为空声明s )是有效的。我相信这对于编写宏有时很有用。因此,GCC 11 删除了在使用时或稍后使用时
-pedantic
的额外诊断。看:;
-std=c++11
您可以使用早于 C++11 的 C++ 标准来恢复旧行为。如果您通过了,GCC 11 和 clang 6 都会发出旧的诊断信息
-std=c++03
。