Loose-Info.com
Last Update 2021/09/18
TOP - 各種テスト - gcc - 警告関連のオプション - -Wswitch-bool

-Wswitch-bool
switchステートメントの制御式の値が真理値で、caseラベルが真理値の範囲外である場合に警告を出力

テスト概要

その1
オプション無し、および-Wswitch-boolオプションを使用した際の警告出力例

その2
caseラベルが真理値の範囲内の場合の警告出力例

その3
switchステートメントの制御式の値を整数に型キャストした場合の警告出力例

実行環境

GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。

その1

オプション無し、および-Wswitch-boolオプションを使用した際の警告出力例

使用ファイル
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オプションはデフォルトで有効となるため、指定した場合と同じ結果となる

その2

caseラベルが真理値の範囲内の場合の警告出力例

使用ファイル
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 エラー・警告無し $

その3

switchステートメントの制御式の値を、整数に型キャストした場合の警告出力例

使用ファイル
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ラベルが存在する場合も、真理値以外に型キャストすることで警告無しとなる