49

マクロ展開の結果を文字列化したいと思います。

私は次のことを試しました:

#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)

そして、私が「thisisatest」を取得しようとしている間、TESTEは「TEST」に拡張されます。これがプリプロセッサの正しい動作であることは知っていますが、他のプリプロセッサを実現する方法を誰かが手伝ってくれますか?

Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do
4

2 に答える 2

79

このような:

#include <stdio.h>

#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST thisisatest
#define TESTE EXPAND_AND_QUOTE(TEST)

int main() {
    printf(TESTE);
}

その理由は、マクロ引数がマクロ本体に置き換えられると、そのマクロで#または##プリプロセッサ演算子が表示されない限り、それらが展開されるためです。したがって、 (コードstrに値を含む)はで展開されませんが、で展開されます。TESTQUOTEEXPAND_AND_QUOTE

于 2010-08-05T21:37:42.777 に答える
16

もう少し明確にするために、基本的にプリプロセッサは別の「ステージ」を実行するように作られました。すなわち:

最初のケース:

->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE 
 # first so it expands it *without expanding its argument* 
 # as the '#' symbol is used
->TEST

2番目のケース:

->TESTE
->EXPAND_AND_QUOTE(TEST)
->QUOTE(thisisatest) 
  # after expanding EXPAND_AND_QUOTE
  # in the previous line
  # the preprocessor checked for more macros
  # to expand, it found TEST and expanded it
  # to 'thisisatest'
->thisisatest
于 2011-05-11T14:18:43.817 に答える