warning: label ‘defalt’ defined but not used
警告:ラベル ‘defalt’ の誤字はただの未使用ラベルになる
[-Wunused-label]
■この記事の概要
この記事では、C言語のswitch
文でdefault
のスペルミスがコンパイルエラーにならない問題を解説しています。
例えば、defalt
のような誤字は単なる未使用ラベルとみなされ、意図した動作をしません。
正しいラベル定義の重要性や誤動作を防ぐための方法を具体例を交えて説明しています。
■default:の誤字はエラーにならない
#include <stdio.h>
int f1(int id)
{
switch(id) {
case 1: return 1;
case 2: return 2;
case 3: return 3;
//ダメ default: の誤字はコンパイルエラーにならない
defalt: return 4;
}
}
int main(void)
{
printf("%d\n",f1(4));
}
defaultの誤字はただの未使用ラベルです。
コンパイラは誤字を指摘しません。
コンパイルエラーにならないので間違いに気が付きません。
この例では return 4 を通過しないのでゴミが返却されます。
■未使用ラベルはエラーにならない
int f2(int id)
{
switch(id) {
case 1: return 1;
case 2: return 2;
case 3: return 3;
//defaultの誤字は未使用ラベルになる
unuseLabel: return 4;
}
return 0;
}
■case1もエラーにならない
#include <stdio.h>
const char *f(int month){
switch (month) {
case1: return "1月";
case2: return "2月";
case3: return "3月";
case4: return "4月";
case5: return "5月";
case6: return "6月";
case7: return "7月";
case8: return "8月";
case9: return "9月";
case10: return "10月";
case11: return "11月";
case12: return "12月";
default:return "想定外入力";
}
}
int main(void){
for(int i = 1;i<=12;i++){
printf("%s\n",f(i));
}
}
コンパイル出来ますが意図した動きをしません。
case 1:を
case1:とクッツケると
未使用ラベルになりますが
コンパイルエラーになりません。
■C言語でよくある誤字 roop
[“roop” C言語]で検索
⇒loopが正解です。
出荷製品にこの誤字がある場合、
適切なソースコードレビューを
入社以来一度も受けた事が無いプログラマが
コーディングした可能性があります。
[“DEBAG” C言語]で検索
⇒DEBUGが正解。
DEBAGは「(いたずら、罰で)ズボンを脱がす」 の意味だそうだ
[”メモリ開放”]で検索
⇒メモリ解放が正解です。
プログラムの仕様書、設計書、コード中のコメントでよく間違えています。