前処理のマクロ置換
前処理のマクロ置換では、一般に、計算順序の正確性を保証するためにカッコを使用することに注意する必要があります.
例:
ここでsquare(z+1)を使用すると問題が発生するので、次のように変更する必要があります.
形式パラメータは引用符付き文字列で置換できません.ただし、テキストを置換すると、パラメータ名が#を接頭辞として使用され、結果は
このパラメータの引用符付き文字列を実際のパラメータで置き換えます.例:
文の使用:
マクロを呼び出すと、次のように拡張されます.
文字列は次のように結合されます.
前処理演算子##は、マクロ拡張に実際のパラメータを接続する手段を提供します.置換テキストのパラメータが##に隣接している場合、そのパラメータは実際に使用されます.
パラメータを置換すると、##と前後の空白文字が削除され、置換後の結果が再スキャンされます.例:
マクロ呼び出しpaste(name,1)の結果、記号name 1が作成されます.
例:
#define square(x) x * x /* WRONG */
ここでsquare(z+1)を使用すると問題が発生するので、次のように変更する必要があります.
#define square(x) ((x) * (x)) /* WRONG */
形式パラメータは引用符付き文字列で置換できません.ただし、テキストを置換すると、パラメータ名が#を接頭辞として使用され、結果は
このパラメータの引用符付き文字列を実際のパラメータで置き換えます.例:
#define dprint(expr) printf(#expr " = %g
", expr)
文の使用:
dprint(x/y)
マクロを呼び出すと、次のように拡張されます.
printf("x/y" " = &g
", x/y);
文字列は次のように結合されます.
printf("x/y = &g
", x/y);
前処理演算子##は、マクロ拡張に実際のパラメータを接続する手段を提供します.置換テキストのパラメータが##に隣接している場合、そのパラメータは実際に使用されます.
パラメータを置換すると、##と前後の空白文字が削除され、置換後の結果が再スキャンされます.例:
#define paste(front, back) front ## back
マクロ呼び出しpaste(name,1)の結果、記号name 1が作成されます.