マクロ展開の結果を文字列化したい。
私は次のことを試しました:
#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
このような:
#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
では展開されます。
もう少し明確にするために、基本的にプリプロセッサは別の「ステージ」を実行するように作成されました。つまり:
最初のケース:
->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