11

プログラムがあります。

#include <stdio.h>

#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)

int main()
{
      printf("%s\n",h(f(1,2)));
      printf("%s\n",g(f(1,2)));
      return 0;
}

このプログラムは正常に動作し、次のような出力を提供します。

12
f(1, 2)

コンパイラがこの出力を与える方法がわかりません。

# ina##bとの機能は何#aですか?

4

3 に答える 3

12

##2 つのトークンを連結します。

重要なことは、プリプロセッサでのみ使用できることです。

演算子は、#トークンを文字列化するために使用されます。

例えば:-

#(a ## b)どれになる#abどれになる"ab"

したがって、h(f(1,2)) は「f(1,2)」になります。

#また、と##は 2 つの異なる演算子であることに注意してください。

プリプロセッサ演算子##は、マクロ展開中に実引数を連結する方法を提供します。置換テキストのパラメーターが ## に隣接している場合、パラメーターは実際の引数に置き換えられ、## と周囲の空白が削除され、結果が再スキャンされます。

詳細については、この連結も確認してください。

ここから:-

文字列化

マクロ引数を文字列定数に変換したい場合があります。パラメータは文字列定数内では置き換えられませんが、代わりに「#」前処理演算子を使用できます。マクロ パラメータが先頭の `#' と共に使用されると、プリプロセッサはそれを文字列定数に変換された実際の引数のリテラル テキストに置き換えます。通常のパラメータ置換とは異なり、引数は最初にマクロ展開されません。これを文字列化と呼びます。

引数を周囲のテキストと組み合わせて、すべて一緒に文字列化する方法はありません。代わりに、一連の隣接する文字列定数と文字列化された引数を記述できます。プリプロセッサは、文字列化された引数を文字列定数に置き換えます。次に、C コンパイラは、隣接するすべての文字列定数を 1 つの長い文字列に結合します。

于 2013-10-05T13:41:30.237 に答える
4

##「トークン貼り付け」演算子または「マージ」演算子と呼ばれ、2 つのトークンを組み合わせて実引数を形成するために使用できます。

#「パラメータ定義を拡張せずにマクロパラメータを文字列リテラルに変換する」文字列化演算子と呼ばれます。

これらは一般にプリプロセッサ オペレータと呼ばれます。このようなプリプロセッサ オペレータが他にもいくつかあります。詳細については、C のプリプロセッサ オペレータ ( http://msdn.microsoft.com/en-us/library/wy090hkc.aspx ) を参照してください。


また、C プリプロセッサの詳細については、http://msdn.microsoft.com/en-us/library/3sxhs2ty.aspxおよびそのページの「関連項目」セクションも参照してください。

于 2013-10-05T13:53:19.077 に答える