В следующем фрагменте кода я использую стандартный [[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";
~~~~~~~~~~^~~~~~~~
Зачем?
c++
switch-statement
c++17
fall-through
s3rvac
источник
источник
Ответы:
После атрибута отсутствует точка с запятой:
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]] ^ ;
Обновление: Коди Грей сообщил об этой проблеме команде GCC.
источник
fallthrough attribute is only allowed on empty statements
; поскольку за ним не следует пустое выражение, gcc просто игнорирует егоclang
исправьте ее.