50

たとえば、私はマクロを持っています:

#define PRINT(int) printf(#int "%d\n",int)

結果はどうなるかわかります。しかし、どうして#intが全体を再現するのでしょうか。

この詳細をちょっと忘れてしまいました。誰かが親切に私にヒントを与えることができますか?

ありがとう!

4

4 に答える 4

51

このコンテキスト(マクロ定義のパラメーター参照に適用される)では、ポンド記号は、このパラメーターを、マクロに渡された引数のリテラルテキストに展開することを意味します。

この場合、PRINT(5)マクロを呼び出すと、展開は次のようprintf("5" "%d\n", 5);になります5 5。あまり役に立ちません。PRINT(5+5)ただし、マクロ展開を呼び出すと、printf("5+5" "%d\n", 5+5);印刷されます5+5 10が、少し簡単ではありません。

この例は、Cプリプロセッサに関するこのチュートリアルで説明されています(ちなみに、これはcマクロポンド記号に対する最初のGoogleヒットです)。

于 2013-01-16T05:43:35.377 に答える
17

「#」は変数の名前を示すことができます。マクロを次のように定義することをお勧めします。

#define PRINT(i) printf(#i " = %d\n", i)

次のように使用します。

int i = 5;
PRINT(i);

表示された結果:

i = 5
于 2013-01-16T05:56:32.820 に答える
6

これはマクロパラメータの名前の悪い選択ですが、無害です(dreamlaxに感謝します)。

基本的に私がそのように書くなら

PRINT(5);

として置き換えられます

printf("5" "%d\n",5);

また

printf("5 %d\n",5);

これは文字列化と呼ばれるプロセスであり、#intはそのコンテンツで構成される文字列に置き換えられます。5- > "5"

于 2013-01-16T05:36:46.270 に答える
2

「#」は文字列化演算子と呼ばれます。Stringize演算子は、渡されたパラメーターを引用符で囲み、文字列を返します。これは、引数を取るmarcoステートメントでのみ使用されます。

#include<stdio.h> 

#define stringLiteral(sl) #sl

int main()
{
   char StringizeOpreator = 'a'; 
   printf(stringLiteral(StringizeOpreator));
   return 0;
}

ここで、stringLiteralmarcoは仮引数を取り、slを返します#sl。渡される実際の引数はStringizeOpreator可変です。returnステートメント#slには#演算子があり、引数のように引用符で囲み"StringizeOpreator"、文字列を返します。

したがって、上記のプログラムの出力は、渡された実際のパラメーターに格納されている値ではなく、実際のパラメーター'StringizeOpreator'の名前になります。

output :
StringizeOperator
...
exitcode 0

詳細については、次のリンクにアクセスしてください: Stringize Operator

于 2020-07-20T08:03:05.147 に答える