web-dev-qa-db-ja.com

Cプリプロセッサ、マクロの結果を文字列化

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

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

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

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

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

このような:

#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);
}

その理由は、マクロ引数がマクロ本体に置換されると、それらが展開されるためですnlessそれらは、そのマクロで#または##プリプロセッサー演算子とともに表示されます。したがって、str(コードではTESTの値)はQUOTEでは展開されませんが、EXPAND_AND_QUOTEでは展開されます。

74
Steve Jessop

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

最初のケース:

->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
15
pratikm