gcc 为什么“迂腐”的现代编译器不再检测到一个流浪的寄生虫?

6jjcrrmo  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(115)

下面的代码片段在有点旧的编译器上添加-pedantic-Werror时生成编译错误。

#include <cstdint>
#include <iostream>

int add(int a, int b){
    return a + b;
}; // <-- stray semicolon

int main (){
    return 0;
}

然而,这不会发生在较新的编译器版本中。请找到GCC(10.x11.x)和Clang(5.x,6.x)的矩阵,以证明https://godbolt.org/z/KWeb8WTxz的差异。
我的问题分为两部分:
1.为什么在最近的编译器中没有触发这个?
1.是否可以在最近的Clang或GCC版本中启用旧行为?

ukdjmx9f

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提到这一点。

相关问题