[[fallthrough]]
属性はswitch
文の中のcase
ラベルを突き抜けるというヒントを出すのに使える。
switch
文では対応するcase
ラベルに処理が移る。通常、以下のように書く。
void f( int x )
{
switch ( x )
{
case 0 :
// 処理0
break ;
case 1 :
// 処理1
break ;
case 2 :
// 処理2
break ;
default :
// xがいずれでもない場合の処理
break ;
}
}
この例を以下のように書くと
case 1 :
// 処理1
case 2 :
// 処理2
break ;
x
が1のときは処理1を実行した後に、処理2も実行される。switch
文を書くときはこのような誤りを書いてしまうことがある。そのため、賢いC++コンパイラーはswitch
文のcase
ラベルでbreak
文やreturn
文などで処理が終わらず、次のcase
ラベルやdefault
ラベルに処理に突き抜けるコードを発見すると、警告メッセージを出す。
しかし、プログラマーの意図がまさに突き抜けて処理してほしい場合、警告メッセージは誤った警告となってしまう。そのような警告メッセージを抑制するため、またコード中に処理が突き抜けるという意図をわかりやすく記述するために、[[fallthrough]]
属性が追加された。
case 1 :
// 処理1
[[fallthrough]]
case 2 :
// 処理2
break ;
[[fallthrough]]
属性を書くと、C++コンパイラーは処理がその先に突き抜けることがわかるので、誤った警告メッセージを抑制できる。また、他人がコードを読むときに意図が明らかになる。
機能テストマクロは__has_cpp_attribute(fallthrough)
, 値は201603。