この (間違った) 構文に似たものを使用してマクロ選択を行うことは可能ですか?
#define FLAG MULT
#ifdef FLAG ADD
int op(int a, int b) {return a + b;}
#endif
#ifdef FLAG MULT
int op(int a, int b) {return a * b;}
#endif
この (間違った) 構文に似たものを使用してマクロ選択を行うことは可能ですか?
#define FLAG MULT
#ifdef FLAG ADD
int op(int a, int b) {return a + b;}
#endif
#ifdef FLAG MULT
int op(int a, int b) {return a * b;}
#endif
あなたはこれを行うことができます:
#define ADD 0
#define MULT 1
#define FLAG MULT
#if (FLAG == ADD)
int op(int a, int b) {return a + b;}
#elif (FLAG == MULT)
int op(int a, int b) {return a * b;}
#endif
ただし、条件付きコンパイルはしばしば悲しいことにつながります (通常、「未使用」ブランチは維持されず、使用に戻ると問題が発生します)。
C++ は、この種の問題のほとんど (すべてではない) を解決するためのより優れたメカニズム (ランタイム ポリモーフィズム、テンプレートなど) を提供します。
#define ADD +
#define MULT *
//...
#define FLAG MULT
//...
int op(int a, int b) {return a FLAG b;}
マクロをできるだけ避け、定義に応じて異なるコードを生成するようにしてください。これは、ODR を破って未定義の動作を引き起こす経路の最初のステップです。
代替手段として、さまざまな代替手段を記述するか、テンプレートを使用することを検討できます (関数には単純な操作よりも多くのロジックがあると仮定します)。
template <typename BinaryFunction>
int op( int a, int b, BinaryFunction f ) {
return f( a, b );
}
int main() {
std::cout << op( 5, 3, std::plus<int>() ) << std::endl; // 8
std::cout << op( 5, 3, std::multiplies<int>() ) << std::endl; // 15
}
マクロのパスをたどる場合は、マクロのスコープを最小限に抑えることを検討してください (つまり#undef
、必要がなくなったらすぐにマクロを作成すること)、非常に明示的で一意の名前を付けることを検討してください (コンポーネント、ファイル、または同様のものを使用して相互作用を回避します。名前の衝突を回避する#define BINARY_OPERATOR_IMPL_FLAG
よりもはるかに優れています#define FLAG
)、他の回答のアドバイスに従ってください。
定義された定数 fe に応じて、確実に marko の動作を変更できます。
config.h
#define MP
#include "other.h"
other.h
#ifdef MP
#define // your define here
#elif
// other define here
#endif
マクロに値を指定して値を確認するか、マクロ名を変更することができます。あれは:
#define MULT 1
#define ADD 2
#define FLAG MULT
#if (FLAG == ADD)
int op(int a, int b) {return a + b;}
#elif (FLAG == MULT)
int op(int a, int b) {return a * b;}
#endif
またはあなたが行うことができます:
#define FLAG_MULT
#ifdef FLAG_ADD
int op(int a, int b) {return a + b;}
#elif defined (FLAG_MULT)
int op(int a, int b) {return a * b;}
#endif
私は個人的にhamstergeneの答えを好みます
#define ADD 0
#define MULT 1
#define FLAG MULT
#if FLAG == ADD
int op(int a, int b) {return a + b;}
#endif
#if FLAG == MULT
int op(int a, int b) {return a * b;}
#endif
// ...
int result = op(2, 3);
assert(result == 6);