6

printf() ステートメント内からのマクロ関数呼び出しの使用を理解する上で問題に直面しています。

私は以下のコードを持っています:

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",f(100,10));
}

このコードは、答えとして「10010」を出力します。

マクロ関数呼び出しは、引数を置き換えた呼び出しの代わりにマクロ関数コードを単純にコピーペーストすることを学びました。

したがって、コードは次のようになります。

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",100##10);
}

しかし、置換マクロを使用して上記のコードを個別に実行すると、コンパイル エラーが発生します。

では、最初のコードでは答えとして 10010 が返され、2 番目のコードではコンパイル エラーが返されるのはなぜでしょうか?

4

3 に答える 3

15

プリプロセッサ連結演算子##は、マクロが置換される前に実行されます。マクロ本体でのみ使用できます。

于 2012-11-26T09:15:38.150 に答える
1

演算子##は、プリプロセッサにとって特別な意味を持ちます。これは、2 つのトークンを「接着」するトークン貼り付け演算子です。したがって、あなたの場合、ghは一緒に「接着」され、新しい token - intliteral になります10010

于 2012-11-26T09:15:45.713 に答える
1

##マクロのように、「単にテキストを置き換える」というルールを変更する特殊文字がいくつかあります。

于 2012-11-26T09:16:24.107 に答える