W poniższym fragmencie kodu używam standardowego [[fallthrough]]
atrybutu z C ++ 1z, aby udokumentować, że pożądane jest przejście:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
W GCC 7.1 kod kompiluje się bez błędu. Jednak kompilator nadal ostrzega mnie przed awarią:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Czemu?
c++
switch-statement
c++17
fall-through
s3rvac
źródło
źródło
Odpowiedzi:
Brakuje średnika po atrybucie:
case 0: std::cout << "a\n"; [[fallthrough]]; // ^ case 1:
[[fallthrough]]
Atrybut ma być stosowana do pustej rachunku (patrz P0188R1 ). Bieżący bagażnik Clang podaje pomocny błąd w tym przypadku :error: fallthrough attribute is only allowed on empty statements [[fallthrough]] ^ note: did you forget ';'? [[fallthrough]] ^ ;
Aktualizacja: Cody Gray zgłosił ten problem zespołowi GCC.
źródło
fallthrough attribute is only allowed on empty statements
; ponieważ nie następuje po nim pusta instrukcja, gcc po prostu ją ignorujeclang
napraw go.