17

に変換する必要があるマクロ引数を文字列化解除したいとします。"text"text

#define UN_STRINGIFY(x) /* some macro magic here */

このマクロを呼び出すと""、引数から削除されます

UN_STRINGIFY("text") // results in ----> text

これは、マクロ文字列化の反対になります。

#define STRINGIFY(x) #x

これは可能ですか、それとも私はマクロの邪悪さで遊んでいますか?

4

2 に答える 2

13

不可能です。これはおそらく良いことです。文字列を渡すと、ほとんどすべてのものを入れることができると想定されます。文字列化を解除すると、コンパイラが実際にその文字列の内容を気にするようになります。

于 2012-04-18T13:44:11.643 に答える
2

私はすでに何度かこの質問に出くわしましたが、それでも頭に浮かびません。次の例を検討してください。

#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 したい状況に陥った場合、とにかく間違った方向に進んでいます;)。

于 2018-06-02T12:18:06.570 に答える