2015-09-11 17 views
5

は、私はこのような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マクロの ユニバーサルバージョンを使用できますか?

答えて

10

あなたは、単一の可変引数マクロとして引数を扱うことができますが:

#define FOO_VERSION 1,0,0,1 

#define STRING_VALUE(...) STRING_VALUE__(__VA_ARGS__) 
#define STRING_VALUE__(...) #__VA_ARGS__ 

これはGCCとのVisual C++で動作するようです。

+0

なぜ私はそれを考えなかったのですか? – amanjiang

関連する問題