は、私はこのようなCのマクロ定義された製品のバージョンがあると、アカウントコンマに取る:定数文字列にマクロ引数を変換し
#define FOO_VERSION 1,0,0,1
そして私は、実行時にそれを印刷したい:
#define STRING_VALUE(x) #x
int main()
{
std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}
"1,0,0,1"ではなく、 "FOO_VERSION"という文字列を出力します。 引数 'FOO_VERSION'は置き換えられません。だから私は このように再びそれを試してみてください。
#define STRING_VALUE(x) STRING_VALUE__(x)
#define STRING_VALUE__(x) #x
int main()
{
std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}
これは、Visual C++ 2013
これは、コードの唯一の5 ラインがあるが、クロスプラットフォームのアプリケーションですで、動作します。コードをコンパイルするためにclangを使用すると、コンパイル時に "function-like マクロ呼び出しの引数が多すぎます"というコンパイルエラーが表示されます。理由は、 'FOO_VERSION'で定義されているカンマです。だから、3番目のバージョン:
#define STRING_VALUE(x) STRING_VALUE__(x)
#define STRING_VALUE__(a, b, c, d) #a "," #b "," #c "," #d
int main()
{
std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}
このコードは打ち鳴らすに動作しますが、ビジュアルC++意志出力警告: 「マクロ 『STRING_VALUE__』の十分でない実パラメータ」 コンパイル時に、もちろん実行時出力が正しくありません。
私の質問:このプリプロセッサの動作は定義されていますか? STRING_VALUEマクロの ユニバーサルバージョンを使用できますか?
なぜ私はそれを考えなかったのですか? – amanjiang