最終更新:2018-07-05 (木) 00:23:46 (2121d)
プリプロセッサ
Top / プリプロセッサ
C言語
#define max(a,b) ((a) < (b) ? (b) : (a))
- Cプリプロセッサは大きくいって次のような処理を行います。
- 行の結合
- コメントの除去
- 条件分岐
- ソースの結合
- 単語の置換
命令
♯define
- # - 引数を文字列として扱うことができる
- ## - 前後の文字を結合する
♯undef?
♯include
♯error?
♯if?, ♯ifdef, ♯ifndef?, ♯else?, ♯elif?, ♯endif?
- #if defined(CREDIT)
♯line?
♯pragma
定義済みマクロ
メタプログラミング
C♯
#if DEBUG Console.WriteLine("DEBUG build"); #else Console.WriteLine("RELASE build"); #endif
VB.NET
#Const SWITCH1 = True '条件付き定数 #If Debug Then Trace.WriteLine("Debug Build") #Else Trace.WriteLine("Release Build") #End If #Region 'ソースコード折り畳み #End Region
メモ
関数のように思ってif文で使ったりすると意図せぬ展開をされてしまうので注意。
#define RETURN(str) if (str == NULL) { \ return ""; \ } else { \ return str; \ } RETURN("abc"); ↓ if ("abc" == NULL) { return ""; } else { return "abc"; };
if (strcmp(s, t) == 0) RETURN(s); else RETURN(t); ↓ if (strcmp(s, t) == 0) if (s == NULL) { return ""; } else { return s; }; //←× else if (t == NULL) { return ""; } else { return t; };
- ×印の行の末尾の「;」のせいで、外側のif文がそこで終わっていると解釈され、次のelseに対応するif文が無いと判断されてコンパイルエラーとなる。
これを回避する手段としては、常套手段としてdo~while(0)が使われる
#define RETURN(str) do { \
if (str == NULL) { \
return ""; \
} else { \
return str; \
} \
} while(0)