私はすでに何度かこの質問に出くわしましたが、それでも頭に浮かびません。次の例を検討してください。
#define FOO(x) x
// FOO( destringify("string x;")) // no way
auto f = "string x;";
FOO(string x;) // hm whats the problem?
私には、引用符を削除できるはずであることは明らかです。つまり、引用符string x;
がないことに他なりません"string x;"
。問題は、それは不可能だということです。それには技術的な理由があるとは思いません。なぜそれを行う方法がないのかを推測することしかできません。
ただし、基本的にすべてのプリプロセッサが行うのはテキストの置換であることを思い出して、自分自身を納得させることができました。したがって、プリプロセッサのレベルでは、とにかくすべてが単なるテキストであるときに、なぜ何かを「非テキスト化」したいのでしょうか。それを逆にしてください。上記の例を次のように変更すると:
#define FOO(x) x
#define STR(x) STRSTR(x)
#define STRSTR(x) #x
#define STR_X string x;
auto f = STR(STR_X)
FOO(STR_X)
その後、文字列を解除する必要はありません。そして、コンパイル時に知られていないマクロを介して文字列を de-stringify したい状況に陥った場合、とにかく間違った方向に進んでいます;)。