为什么即使我使用[[fallthrough]],GCC也会警告我有关失败的消息?


86

在下面的代码中,我使用[[fallthrough]]C ++ 1z的standard属性来说明需要进行彻底检查:

#include <iostream>

int main() {
    switch (0) {
        case 0:
            std::cout << "a\n";
            [[fallthrough]]
        case 1:
            std::cout << "b\n";
            break;
    }
}

使用GCC 7.1,代码可以正确编译。但是,编译器仍然警告我一个失败之处:

warning: this statement may fall through [-Wimplicit-fallthrough=]
    std::cout << "a\n";
    ~~~~~~~~~~^~~~~~~~

为什么?


33
在这里,我以为C ++人员不可能使事情变得更丑!
SnakeDoc '17

3
@SnakeDoc:这是礼物!
Deduplicator

3
@SnakeDoc这应该是对答案的评论,这会使情况更糟。:)

23
我不同意直接投票。对于OP的问题仅是由于某些与问题描述无关的错误而发生的情况存在“简单的印刷错误”原因,对其他任何人都没有用。在这种情况下,其他人很可能会忘记那个地方的分号,得到相同的错误,并在寻找解决方案时发现了这个问题。
CodesInChaos

14
我非常不喜欢将我的评论从该问题中删除,因此我被迫再次重复该问题-虽然这确实是一个印刷错误,但其他用户很可能会重复该问题,进行搜索,并使用此答案找到该问题。因此,这既是一个很好的问题,又是一个很好的答案,值得保留。
巴里

Answers:


105

您在属性后缺少分号:

case 0:
    std::cout << "a\n";
    [[fallthrough]];
    //             ^
case 1:

[[fallthrough]]属性将应用于空语句(请参阅P0188R1)。在这种情况下,当前的Clang干线会给出一个有用的错误

error: fallthrough attribute is only allowed on empty statements
    [[fallthrough]]
      ^
note: did you forget ';'?
    [[fallthrough]]
                   ^
                   ;

更新:Cody Gray向GCC团队报告了此问题。


提及不带分号的属性所适用的内容会很好。我认为是下一个情况?
CodesInChaos

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; 由于它后面没有空语句,因此gcc只会忽略它
musicman523

2
@ musicman523那...似乎...错了吗?看起来,即使在后面跟一个空语句时,要求使用分号也更为理智,而拒绝以其他方式编译。
SnakeDoc'7

@SnakeDoc显然,这只是语句属性的一种特殊情况,因此解析器允许它通过,但是当应用于非空语句时,它没有任何语义。如果愿意,可将其视为错误,并进行clang修复。
巴玛(Barmar)'17年

2
@CodesInChaos如果不使用分号,则属性将属于标签。
TC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.