このページはC++17に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
[[fallthrough]]
属性は意図したフォールスルーであることをコンパイラに伝え、警告を抑制するための属性である。
switch-case文において意図しないフォールスルーによってバグが発生することを防止するため、コンパイラはコンパイル時にフォールスルーを検出して警告を出力する場合がある。
プログラマが意図してフォールスルーを行う場合、コンパイラの警告は無用である。しかし従来はコンパイラごとに警告を抑制する方法が異なり、標準的な方法は無かった。C++17では[[fallthrough]]
属性により意図したフォールスルーであることをコンパイラに伝え、警告を抑制することができる。
仕様
[[fallthrough]]
属性はフォールスルーしたい各case
の最後の式に記述する。ただし最後のcase
/default
に記述するとコンパイルエラーとなる。
例
#include <iostream>
int main() {
int n = 3;
switch (n) {
case 1:
case 2: //caseの間に1つも文がなければフォールスルーは警告されない
std::cout << "case 2\n";
[[fallthrough]];
case 3: //[[fallthrough]]属性の記述によりフォールスルー警告は無効化される
std::cout << "case 3\n";
case 4: //コンパイラがフォールスルーを警告する
std::cout << "case 4\n";
//[[fallthrough]]; //最後のcaseには記述できない、コンパイルエラーになる
}
}
出力
case 3
case 4
警告例
g++ 7.1.0、-Wextra
オプションでコンパイルした場合:
fallthrough.cpp: In function ‘int main()’:
fallthrough.cpp:11:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "case 3\n";
~~~~~~~~~~^~~~~~~~~~~~~
fallthrough.cpp:12:3: note: here
case 4: //コンパイラがフォールスルーを警告する
^~~~