Last Update 2021/09/18
-Wswitch-bool
switchステートメントの制御式の値が真理値で、caseラベルが真理値の範囲外である場合に警告を出力
テスト概要
オプション無し、および-Wswitch-boolオプションを使用した際の警告出力例
caseラベルが真理値の範囲内の場合の警告出力例
switchステートメントの制御式の値を整数に型キャストした場合の警告出力例
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
オプション無し、および-Wswitch-boolオプションを使用した際の警告出力例
使用ファイル
sample1.c
着色部は真理値範囲(0、1)以外のcaseラベル
sample1.c
着色部は真理値範囲(0、1)以外のcaseラベル
#include <stdio.h>
int main(void)
{
int n = 0;
switch (n == 1)
{
case 0:
printf("n = 0\n");
break;
case 1:
printf("n = 1\n");
break;
case 2:
printf("n = 2\n");
}
return 0;
}
-Wswitch-boolオプションを指定して実行
$ gcc -Wswitch-bool sample1.c
sample1.c: In function ‘main’:
sample1.c:7:2: warning: switch condition has boolean value [-Wswitch-bool]
switch (n == 1)
^~~~~~
$ switchステートメントの制御式が真理値で、caseラベルが真理値の範囲外の場合、警告を出力
オプション無しで実行
$ gcc sample1.c
sample1.c: In function ‘main’:
sample1.c:7:2: warning: switch condition has boolean value [-Wswitch-bool]
switch (n == 1)
^~~~~~
$ -Wswitch-boolオプションはデフォルトで有効となるため、指定した場合と同じ結果となる
caseラベルが真理値の範囲内の場合の警告出力例
使用ファイル
sample2.c
sample2.c
#include <stdio.h>
int main(void)
{
int n = 0;
switch (n == 1)
{
case 0:
printf("n = 0\n");
break;
case 1:
printf("n = 1\n");
}
return 0;
}
-Wswitch-boolオプションを指定して実行
$ gcc sample2.c エラー・警告無し
$
switchステートメントの制御式の値を、整数に型キャストした場合の警告出力例
使用ファイル
sample3.c
sample3.c
#include <stdio.h>
int main(void)
{
int n = 0;
switch ((int)(n == 1))
{
case 0:
printf("n = 0\n");
break;
case 1:
printf("n = 1\n");
break;
case 2:
printf("n = 2\n");
}
return 0;
}
-Wswitch-boolオプションを指定して実行
$ gcc sample3.c エラー・警告無し
$ 範囲外のcaseラベルが存在する場合も、真理値以外に型キャストすることで警告無しとなる