今回は条件付きコンパイルについて紹介していきます。
僕もこの記述方法を知ってから多用しているので是非参考にどうぞ。
条件付きコンパイルとは?
簡潔に言うとコードのコンパイルする部分を選択できる文です。
とりあえずコードをどうぞ
#include <stdio.h>
#if 0
int test(void){
return 0;
}
#endif
#if 0
int test(void){
return 1;
}
#endif
#if 1
int test(void){
return 2;
}
#endif
int main(void) {
printf("%d\n",test());
return 0;
}
ぱっと見ると
いや関数testが3回定義されてるからエラーになるやん!
って感じですよね。
でも大丈夫です。
すべての関数testの上下が
#if
#endif
で囲われていますよね。
これが条件付きコンパイルです。
上のコードの場合、3つあるtestのうち一番下以外のtestは無視されてます。
よって定義が重複されてないことになってコードが成り立ってるんですね。
使い方をみていきましょう。
使い方
まず普通のif文は知っていると思うのでそれに対応させて解説していきます。
#if
これはif文でいうifです。そのままですね。
使い方も似ていて
#if (式)
で記述します。
式を評価して0ならコンパイルする、それ以外なら無視する
です。ifと同じですね。
記述は関数内にもできますが、関数外にもできます。
#elif
これはif文でいうelse ifです。
#ifの下に
#elif (式)
で記述してあとは#ifと同じです。
#else
これはif文でいうelseです。
#ifか#elifの下に
#else
で記述します。
上の#ifか#elifの部分がコンパイルされれば無視、
そうでなければコンパイルします。
#endif
これはif文にはないですね。条件付きコンパイルの終了を示します。
上の3つの#の下に
#endif
で記述します
簡単にまとめると
こんな感じで使います
#define A 1
#if A==1
//処理
#elif A==2
//処理
#else
//処理
#endif
で使ったり、
#define A 1
#if A==1
//処理1
#endif
//処理2
#if A==2
//処理3
#endif
//処理4
こんな感じで使います。
これだと処理2と4は確定で行いますが、処理1と2はAの値によります
何が嬉しいのか?
僕はよく大学の課題を解くときに使ってます。
プログラムがうまく行かなくて
ある関数の中身を大幅に変えようと思ったときに色々いじって更にわけわからなくなったら嫌ですよね。
かといって違う名前の関数を作成したとしてもmain関数内で何度も定義していたらいちいちその部分を書き換えるのもだるいですよね。
そんなときは一度其の関数をコピーしてコード内に貼り付けて、改良していきます。
改良する前(コピー元)の関数は
#if 0 #endifで囲めば無視されるので重複を防げます。
これは条件付きコンパイルが関数外でも書ける特性を使ってますね
他にも画像処理を場合、使うフィルタを切り替えるときとかに
わざわざswitch文を記述するのがだるいときとかも使いますね。
普通に関数内でも記述できますからね。
などなどコードの記述の効率化ができます。
ぜひ使ってみてください。
ではまた
コメント