1

私は以下のようなテストプログラムを持っています。

  #define TEST(A,B)  A
  #define TEST2(A,B) (A,B)
  #define TEST3(A,B) TEST TEST2(A,B)

  int main()
  {
     TEST3(Hello,World)  //This will expand to TEST (Hello,World)
     TEST (hello, World) // This will expand to hello
  }

TEST3""に展開されますが、定義TEST (Hello,World)を使用してさらに展開されることはありません。私は当初、それは定義の間と定義内のTESTスペースによるものだと思っていました。しかし、の単純な呼び出しは適切に拡張されます。誰かがここで何が起こっているのか説明できますか?TESTTEST2(hello, world)TEST3TEST (hello, world)

4

1 に答える 1

2

TEST inという単語#define TEST3(A,B) TEST TEST2(A,B)は、開き括弧が後に続かないため、関数のようなマクロ呼び出しではありません。プリプロセッサが拡張しているときTEST3(Hello, World)、それはTESTに遭遇し、それが関数のようなマクロの呼び出しではないことを発見し、それをテキストとして出力します。次に、それは処理TEST2(A, B)し、それはマクロ呼び出しであるため、対応するテキスト、つまりを出力(Hello,World)し、開き括弧を使用して処理を続行します。テストは終了し、二度と前処理されることはありません。

標準からの引用符を使用したマクロ展開の詳細については、Cプリプロセッサと連結を参照してください。いくつかのヘルプのCマクロの値からchar文字列を作成する方法も見つかるかもしれません。

于 2012-11-19T06:43:07.960 に答える