else ifを使いすぎるとコンパイルエラー
3回目の投稿になりますTHです。
今回は最近遭遇してしまったコンパイルエラーについてお話したいと思います。
多くのシステムは必ずといってもいいほど「if文」を使われているはず。
もちろん弊社のシステムにも数えきれないほど使ってます。
まず、開発環境はMicrosoft Visual 2012を使用しており、C++で開発しております。
今回説明するコンパイルエラーについてですが、エラー理由はすごく簡単で、「else if」の使い過ぎ・・・。
//■例 void main(){ if (strcmp(mozi,"赤") == 0 )return 1; else if (strcmp(mozi,"黄") == 0 ) return 2; else if (strcmp(mozi,"青") == 0 ) return 3; else if (strcmp(mozi,"黄緑") == 0 ) return 4; else if (strcmp(mozi,"緑青") == 0 ) return 5; else if (strcmp(mozi,"緑") == 0 ) return 6; ・ ・ ・ else if (strcmp(mozi,"紫") == 0 ) return 130; else if (strcmp(mozi,"紅") == 0 ) return 131; else if (strcmp(mozi,"レインボー") == 0 ) return 133; }
実は、else ifには使用数に制限があります。具体的な数は123個でした。123個以上になるとコンパイルエラーがでます。
実際に遭遇した時の話ですが、文字列の比較のためにelse ifが100個相当ありました。
新しく仕様を変える場合は、既存の文字列を比較している部分のテストも行わないといけなくなるので、
とりあえず、続けてelse ifを付け足してビルドしてみると、
コンパイラの制限:プログラム内のブロックの入れ子のレベルが深すぎます。
というコンパイルエラーが発生。
else if を数えてみると・・・、130越え・・・。
そりゃ、エラーでる(笑)。
コンパイラの制限の解決方法(else if編)
解決方法もシンプルで、コンパイルエラーの原因を述べた通り、else ifの数を減らせばよい。
途中でelse ifをやめてもう一度ifから初めてもよい。
//■解決例 void main(){ if (strcmp(mozi,"赤") == 0 )return 1; else if (strcmp(mozi,"黄") == 0 ) return 2; else if (strcmp(mozi,"青") == 0 ) return 3; else if (strcmp(mozi,"黄緑") == 0 ) return 4; else if (strcmp(mozi,"緑青") == 0 ) return 5; else if (strcmp(mozi,"緑") == 0 ) return 6; ・ ・ ・ else if (strcmp(mozi,"黄土") == 0 ) return 64; //ここで一回区切る if (strcmp(mozi,"紺") == 0 ) return 65; ・ ・ ・ else if (strcmp(mozi,"紫") == 0 ) return 130; else if (strcmp(mozi,"紅") == 0 ) return 131; else if (strcmp(mozi,"レインボー") == 0 ) return 133; }
上記のような例ではそのまま使えないが、可能なら以前紹介したswitch文を使ってもよい。
下記で記載した通り、switch文のほうもはやい。
https://test-www.widesoft.co.jp/news/3772
まとめ
今回のエラーに遭遇して思ったことがある。
一回の比較でelse if を多用するのは問題があるのかもしれないが、120個くらいの制限は少ない。
状況にもよるが、可能ならswitch文に置き換えるほうがよい。
システムの設計段階なら、else ifの使い方には今後のメンテナンス性を考えて、
switch文と使い分け等、else ifを多用しなくてもいいように設計すべきである。