C言語#defineで#演算子と#演算子を使用

1932 ワード

次にクラス関数マクロを示します.
#define PSQR (X) printf("The square of X is %d.
",((X) * (X)));

マクロを使用する場合は、次の手順に従います.
PSQR(8);

次のように出力されます.
The square of X is 64.

引用符の文字列のXは、置換可能な言語記号ではなく、通常のテキストと見なされます.
1.マクロパラメータによる文字列の作成:#演算子
クラス関数マクロの置換セクションでは、#記号は言語記号を文字列に変換する前処理演算子として使用されます.たとえば、Xがマクロパラメータである場合、#Xはパラメータ名を対応する文字列に変換することができる.このプロセスを文字列化(stringizing)と呼ぶ.例:
#define 
#define PSQR(x) printf("The square of  " #x " is %d.
",((x) * (x))) int main(void) { int y = 5; PSQR(y); PSQR(2 + 4); return 0 }

出力は次のとおりです.
The square of y is 25.
The square of 2 + 4 is 36.

マクロを最初に呼び出すときは、#xの代わりに「y」を使用します.2回目のマクロ呼び出しでは、#xの代わりに「2+4」を使用します.ANSI Cの文字列リンク機能は、これらの文字列をprintf()文の他の文字列と組み合わせて、最終的に使用される文字列を生成します.たとえば、最初の呼び出しは次のようになります.
printf("The square of " "y" " is %d.
",((y) * (y)));

次に、文字列接続機能は、隣接する3つの文字列を1つの文字列に変換します.
"The square of y is %d.
"

2、プリプロセッサの接着剤:##演算子
##演算子と同様に、##演算子はクラス関数マクロの置換部分に使用できます.また、##はクラスオブジェクトマクロの置換部分にも使用できます.この演算子は2つの言語記号を単一の言語記号に組み合わせる.例:
#define XNAME (n) x ## n

次のマクロ呼び出しを行います.
XNAME(4)

次のように展開されます.
x4

手順は次のとおりです.
#include 
#define SNAME (n) x ## n
#define PRINT_XN (n) printf("x" #n " = %d
", x ## n); int main(void) { int XNAME(1) = 14; // int xi = 14; int XNAME(2) = 20; // int x2= 20; PRINT_XN(1); // printf("x1 = %d
", x1); PRINT_XN(2); // printf("x2 = %d
", x2); return 0; }

出力は次のとおりです.
x1 = 14
x2 = 20

参考書:C Primer Plus第5版(Stephen Prata)