2017-08-25 13 views
0

状況依存のマクロを作成したいとします。このマクロはMacros.hというファイルにあります。私はユニットテストルーチンから呼び出されたときにログメッセージを出力しないマクロを定義したい。だから、私はこのようにマクロはUNIT_TESTINGに依存しますのでC++で条件文に展開されるマクロを定義する方法は?

#define LOG_INFO(x) if(!UNIT_TESTING) qInfo().noquote().nospace() << x 

のように変更され、私は、コンパイラがで

declaration does not declare anything [-fpermissive] 
extern bool UNIT_TESTING; // Whether in course of unit testing 
     ^

を伝え、しかし

extern bool UNIT_TESTING; // Whether in course of unit testing 

同じMacros.h

で提供しました同じ時刻に、 Macros.hが含まれているファイルで外部が宣言されていると、正常に動作します。私は何かを間違えますか?

+0

あなたは 'extern" Cブロックにいますか? 'UNIT_TESTING'マクロですか? – Jarod42

+0

もちろんこれは条件マクロではありません。これは、条件文に展開される無条件マクロです。 – MSalters

+2

本当にマクロを使いたいですか?ロギングクラスはより多くの弾丸証明であり、印刷するときと印刷しないときにそのクラスに属性を与えることができます。 – NathanOliver

答えて

2

Hereは、ソースファイル間で変数を共有する方法です。それにもかかわらず、そうするのではなく、これを処理する関数(bool IS_UNIT_TESTING())またはクラスを実装することを強くお勧めします。このようにして、インタフェースを変更せずに実装を変更することができます。また、Macros are evil。エラーが発生しやすく、簡単にデバッグできません。代わりに、インライン関数またはconstexpを使用してください。コンパイラはほとんど同じコードに最適化します。

関連する問題