내가 [[fallthrough]]를 사용해도 GCC가 폴 스루에 대해 경고하는 이유는 무엇입니까?


86

다음 코드에서는 [[fallthrough]]C ++ 1z 의 표준 속성을 사용하여 폴스 루가 필요함을 문서화합니다.

#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

3
@SnakeDoc : 선물입니다!
Deduplicator

3
@SnakeDoc 답변에 대한 의견이어야합니다. :)

23
나는 가까운 투표에 동의하지 않습니다. "간단한 인쇄상의 오류"이유는 OP의 문제가 질문 설명과 관련이없는 실수로 인해 발생한 경우에만 존재하며 다른 사람에게는 유용하지 않습니다. 이 경우 다른 사람들이 그 자리에서 세미콜론을 잊어 버리고 동일한 오류가 발생하고 해결책을 찾을 때이 질문을 찾을 가능성이 큽니다.
CodesInChaos

14
나는 내 의견 이이 질문에서 제거되어 다시 반복 해야하는 것을 강력히 싫어합니다. 이는 실제로 인쇄상의 오류이지만 다른 사용자가 반복하여 검색 하고이 답변 으로이 질문을 찾을 가능성이 큽니다. 따라서 그것은 좋은 질문이자 좋은 대답이며 공개 된 상태로 둘 가치가 있습니다.
Barry

답변:


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 jul.

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; 이 빈 문 뒤에되지 않기 때문에, GCC는 단순히 그것을 무시
musicman523

2
@ musicman523 그 ... 그게 ... 잘못된 것 같나요? 빈 명령문이 뒤 따르더라도 세미콜론을 요구하고 그렇지 않으면 컴파일을 거부하는 것이 겉으로는 더 제정신입니다.
SnakeDoc

@SnakeDoc 분명히 이것은 명령문 속성의 특정 경우이므로 파서가이를 허용하지만 비어 있지 않은 명령문에 적용될 때 의미 체계가 없습니다. 원하는 경우 버그로 간주하고 clang수정하십시오.
Barmar

2
@CodesInChaos 세미콜론이 없으면 속성이 레이블에 적용됩니다.
TC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.