このような(間違った)構文を使用してマクロを選択することはできますか?マクロの選択
#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++は、このような問題のほとんど(ただしすべてではない)を解決するために、より良いメカニズム(実行時の多形性、テンプレートなど)を提供します。
+1でも、第2の条件として '#elif'を使うこともできます。 – FatalError
#define ADD +
#define MULT *
//...
#define FLAG MULT
//...
int op(int a, int b) {return a FLAG b;}
は、あなたは確かにあなたが値をマクロに値を与えると確認することができますいずれか
config.h
#define MP
#include "other.h"
other.h
#ifdef MP
#define // your define here
#elif
// other define here
#endif
定義された定数 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の答え
#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);
を好みます定義に応じて異なるコード。これは、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
よりはるかに優れています)、その後、他の回答のアドバイスに従ってください。
2番目の条件で '#ifdef FLAG MULT'を使用したと思いますか? –
うん、ありがとう。私は編集しました。 – Aslan986
全体の目標は何ですか?私は興味がある。 – Benj