我正在GCC编译器版本7.1.0上测试C ++ 17功能。
这与fallthrough
属性有关,下面的示例(live example)改编自在线CPP参考here
#include "iostream"
using namespace std;
int f(int n) {
switch (n) {
case 1:
case 2:
n = n + 20;
[[fallthrough]];
case 3: // no warning on fallthrough
n = n + 30;
case 4: // compiler may warn on fallthrough
[[fallthrough]]; // illformed, not before a case label
//n = n + 40; //commented out to test if compiler will warn.
}
return n;
}
int main()
{
cout << f(1) << endl;
cout << f(2) << endl;
cout << f(3) << endl;
cout << f(4) << endl;
return 0;
}
最后一个[[fallthrough]]
(对于case 4:
)格式错误。
“根据标准对格式错误的程序进行C ++编译器需要做什么?”的问题here的顶部answer指出:
总而言之:如果格式错误的程序包含可诊断的违规行为,而标准未明确规定“不需要诊断”,则符合规范的实现应发出诊断信息。
>
因此,我查阅了标准(N4713),看是否表明该问题不需要诊断。我找不到任何这样的陈述。
有趣的是,当我在最后一个[[fallthrough]]
n = n + 40;
编译器警告(live example):
警告:属性“ fallthrough”不在案例标签或默认标签之前
因此,这里有两个问题:
答案 0 :(得分:9)
- 如果是编译器问题,是否严重到可以报告?
是的,一致性错误是重要的错误,开发人员依赖符合标准的编译器(尽管gcc需要-pedantic to obtain all diagnostics required by the standard,但编译器可能具有不需要严格一致性的模式)。但是仅仅记录该错误并让编译器团队确认它为错误可以为遇到该错误的未来开发人员提供巨大帮助。
- 编译器是否错过了发出诊断的机会,还是我在这里错过了什么?
是的,根据[dcl.attr.fallthrough#]p1格式错误:
...在fallthrough语句之后将要执行的下一条语句应为带标签的语句,其标签为案例标签或同一switch语句的默认标签。 如果没有这样的声明,程序格式错误。
,并且要求编译器至少按照[intro.compliance]p2.2发出诊断信息:
如果程序包含任何可诊断规则的违反或出现了以下描述的构造 如果实现不支持该构造,则此文档为“有条件支持”, 符合标准的实现应至少发布一条诊断消息。
答案 1 :(得分:3)