0

この (間違った) 構文に似たものを使用してマクロ選択を行うことは可能ですか?

#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
4

6 に答える 6

8

あなたはこれを行うことができます:

#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++ は、この種の問題のほとんど (すべてではない) を解決するためのより優れたメカニズム (ランタイム ポリモーフィズム、テンプレートなど) を提供します。

于 2012-05-03T12:46:12.100 に答える
7
#define ADD +
#define MULT *
//...
#define FLAG MULT
//...
int op(int a, int b) {return a FLAG b;}
于 2012-05-03T12:46:17.890 に答える
4

マクロをできるだけ避け、定義に応じて異なるコードを生成するようにしてください。これは、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)、他の回答のアドバイスに従ってください。

于 2012-05-03T12:59:22.310 に答える
1

定義された定数 fe に応じて、確実に marko の動作を変更できます。

config.h
#define MP
#include "other.h"

other.h
#ifdef MP
 #define // your define here
#elif
 // other define here
#endif
于 2012-05-03T12:47:28.763 に答える
1

マクロに値を指定して値を確認するか、マクロ名を変更することができます。あれは:

#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の答えを好みます

于 2012-05-03T12:48:52.197 に答える
1
#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);
于 2012-05-03T12:49:58.813 に答える