2017-12-11 13 views
0

私はC++で別のマクロを定義するためにマクロを使いたいです。マクロが定義するマクロには2つの引数があり、1つは "#ifdef"テストを実行するマクロの名前、もう1つは#defineの新しいマクロの名前です。この例は省かれています。実際の状況は複雑なので、私はそれを除外したいのです。C++では、引数をマクロ名として使用してマクロを定義するマクロを使用できますか?

#define TEST_ME // or NOT 


#define DEFINE_A_MACRO(_test_me_, _define_me_) \ 
                \ 
    #ifdef (actual value of)_test_me_     \ 
     #define (actual value of _define_me_) One Thing \ 
    #else             \ 
     #define (actual value of _define_me_) Another Thing \ 
    #endif 

... 

    DEFINE_A_MACRO(TEST_ME, DEFINE_ME) 

これを実行する方法はありますか? 私はそれを疑うかもしれませんが、質問をする可能性もあります。

+0

マクロ展開は、プリプロセッサディレクティブを含めることはできません。 –

+0

#defineマクロで#記号をエスケープしますか? と同じ質問ではありません。 "はい"と答えると、マクロでハッシュ記号をエスケープできます。 しかし、回答の1つがマクロの内容を "再スキャン"してプリプロセッサディレクティブ。この質問には、答えはいいえ - これは検索で得られる可能性が高いと言われる方法です。 – peterk

答えて

1

いいえ、プリプロセッサは複数のレベルのトークン置換をサポートできますが、1つのマクロは別のマクロを参照することができますが、これはトークンにのみ適用されます。新しいプリプロセッサディレクティブを生成することはできません。言い換えれば

、あなたが

#ifdef TEST_ME 
    #define THING ONETHING 
#else 
    #define THING ANOTHERTHING 
#endif 
#define DEFINE_ME THING 

によってこの問題を解決(またはC++コードを書くことで - マクロのは、これらの日は本当に不要です)

+0

一般的なソースを持つさまざまなバージョンのライブラリ用にプラットフォーム固有のコードを定義するために必要なことがよくあります。 と厄介なビットマイクロソフトでは、dllimport dllのエクスポートを宣言する必要があります。リンケージとビルドの種類を指定しないでください。 – peterk

+0

これは可能ですが、NOは有効な回答ですが回答として選択しました。 – peterk

関連する問題