私は、いくつかの変数を定義するマクロがあるとします。コードの異なる部分で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;
}
コマンドラインフラグとしてenableを設定して、フラグ付きでもなくてもコンパイルできます。 –
同じプロジェクトです。それはひどい部分です。どちらのブロックも特定のコンパイルのライブコードであり、異なる領域で異なる定義がされています。 – Carbon
@Carbonこれらのマクロブロックの両方を適切な代替方法で置き換える必要があるようです。 – VTT