2017-11-13 14 views
2

私は、いくつかの変数を定義するマクロがあるとします。コードの異なる部分で2つの方法を定義する必要があります(はい、それは悪い考えですが、リファクタリングは長続きします)。C++マクロの大きなブロック間をフリップすることはできますか?

以下のスニペットを有効にすることはできますか。つまり、4と1を印刷することは可能ですか?

#include <iostream> 
#define ENABLE 
#ifdef ENABLE 
#define B 4 
#define C 5 
//imagine a bunch more here 
#else 
#define B 1 
#define C 2 
//imagine a bunch more here 
#endif 

int main() 
{ 
    std::cout << B << std::endl; 
#pragma push_macro("ENABLE") 
#undef ENABLE 
    std::cout << B << std::endl; 
#pragma pop_macro("ENABLE") 

    return 0; 
} 

それは、特にBを定義することで同じ効果を達成することは確かに可能だが、私は、マクロの大きなブロックを持っている場合、それは100%実用的ではありません。

#include <iostream> 
#define B 4 

int main() 
{ 
#pragma push_macro("B") 
#undef B 
#define B 1 
    std::cout << B << std::endl; 
#pragma pop_macro("B") 
    std::cout << B << std::endl; 
    return 0; 
} 
+0

コマンドラインフラグとしてenableを設定して、フラグ付きでもなくてもコンパイルできます。 –

+0

同じプロジェクトです。それはひどい部分です。どちらのブロックも特定のコンパイルのライブコードであり、異なる領域で異なる定義がされています。 – Carbon

+0

@Carbonこれらのマクロブロックの両方を適切な代替方法で置き換える必要があるようです。 – VTT

答えて

10

あなたはそれを行うことができるかもしれません

ヘッダー:繰り返し#includeでヘッダファイルをINGの

// Note: no inclusion guards! 
#undef B 
#undef C 
#ifdef ENABLE 
#define B 4 
#define C 5 
//imagine a bunch more here 
#else 
#define B 1 
#define C 2 
//imagine a bunch more here 
#endif 

会社srcファイル内の年齢:

int main() 
{ 
#define ENABLE 
#include "header" 
    std::cout << B << std::endl; 
#undef ENABLE 
#include "header" 
    std::cout << B << std::endl; 
    return 0; 
} 
+0

これは素晴らしいトリックです!この混乱がなくなるまで、私はそれを使用します。ありがとう。 – Carbon

+4

これはうんざりです。私はupvoted。 –

+1

これはインターネット上の指示に従ったときとほとんど同じくらい悪く、 'sed'で壊れた' .so'ファイルを修正しました。 – Omnifarious

関連する問題