最終更新: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)