2012-05-03 3 views
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 
+1

2番目の条件で '#ifdef FLAG MULT'を使用したと思いますか? –

+0

うん、ありがとう。私は編集しました。 – Aslan986

+0

全体の目標は何ですか?私は興味がある。 – Benj

答えて

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++は、このような問題のほとんど(ただしすべてではない)を解決するために、より良いメカニズム(実行時の多形性、テンプレートなど)を提供します。

+0

+1でも、第2の条件として '#elif'を使うこともできます。 – FatalError

7
#define ADD + 
#define MULT * 
//... 
#define FLAG MULT 
//... 
int op(int a, int b) {return a FLAG b;} 
1

は、あなたは確かにあなたが値をマクロに値を与えると確認することができますいずれか

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

other.h 
#ifdef MP 
#define // your define here 
#elif 
// other define here 
#endif 
1

定義された定数 FEに応じて、マルコの動作を変更したり、マクロ名を変更することができます。つまり:

あなたが行うことができます
#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の答え

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); 
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よりはるかに優れています)、その後、他の回答のアドバイスに従ってください。