Dalam potongan kode berikut, saya menggunakan [[fallthrough]]
atribut standar dari C ++ 1z untuk mendokumentasikan bahwa diperlukan fallthrough:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
Dengan GCC 7.1, kode dikompilasi tanpa kesalahan. Namun, kompilator masih memperingatkan saya tentang kesalahan:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Mengapa?
c++
switch-statement
c++17
fall-through
s3rvac.dll
sumber
sumber
Jawaban:
Anda kehilangan titik koma setelah atribut:
case 0: std::cout << "a\n"; [[fallthrough]]; // ^ case 1:
The
[[fallthrough]]
atribut yang akan diterapkan untuk pernyataan kosong (lihat P0188R1 ). Batang Clang saat ini memberikan kesalahan yang berguna dalam kasus ini :error: fallthrough attribute is only allowed on empty statements [[fallthrough]] ^ note: did you forget ';'? [[fallthrough]] ^ ;
Pembaruan: Cody Grey melaporkan masalah ini ke tim GCC.
sumber
fallthrough attribute is only allowed on empty statements
; karena tidak diikuti oleh pernyataan kosong, gcc mengabaikannyaclang
perbaiki.