2017-02-21 3 views
1

は私のコードです:マクロ制御DEBUG

macro1.h

#ifndef NO_DEBUG 
#define DEBUG(arg) cout<<endl<<arg<<endl 
#else 
#define DEBUG(arg) 
#endif 

macro1.cpp

#include <iostream> 
#include "macro1.h" 
using namespace std; 
int main() 
{ 
    cout<<endl<<"start"<<endl; 
    DEBUG("debug line 1"); 
    #undef NO_DEBUG 
    DEBUG("debug line 2"); 
    #define NO_DEBUG 
    DEBUG("debug line 3"); 
    cout<<endl<<"end"<<endl; 
    return 0; 
} 

私はこのようにそれを実行/コンパイル:

コンパイル+実行1:

$ g++ macro1.cpp 

$ ./a.out 

start 

debug line 1 

debug line 2 

debug line 3 

end 
$ 

コンパイル+実行2:

$ g++ macro1.cpp -DNO_DEBUG 

$ ./a.out 

start 

end 
$ 

しかし、それはNO_DEBUGが、それは印刷に持っていた定義されていないので、私は、最初の実行で を期待したものではありません。セカンドランで

start 

debug line 1 

debug line 2 

end 

、我々コマンドラインでマクロを定義しているので、印刷する必要がありました。

start 

debug line 2 

end 

何が起こっているのか教えてください ここに?

私は前処理機能のみを使用していますので、正しく機能するはずです。

+0

'#include" macro1.h "のポイントで定義されたマクロだけが問題です。 –

+0

しかし、その.hファイルの内容は、.cppファイルの中に貼り付けられたコピーでもかまいません。また、.cppの前処理はまだ必要です。だからなぜ '#include" macro1.h "'が問題になるのでしょうか? – Sumit

+0

プリプロセッサはあなたが思っているよりもダンベルです。インクルードを行い、上から下にファイルを移動します。あなたの '.cpp'の状態を' #include "macro1.h" 'の後ろで調べると、何が起きているのかがわかります。 –

答えて

1

プリプロセッサの仕組みを誤解しているようです。 http://www.cplusplus.com/doc/tutorial/preprocessor/

特に問題は次のとおりです。DEBUGマクロは、NO_DEBUGマクロ定義に基づいて1回のみ定義されます。プリプロセッサがどの定義を使用するかを決定すると、DEBUGマクロの定義を変更することはできません。あなたはこれを達成するために#unset /#defineを使用しようとしていますが、@Baum mit Augenが指摘したように、プリプロセッサは単なるテキスト置換エンジンであり、非常に "ダム"です。テキストを置き換える以外には何も気にしません。

実際のDEBUGマクロが使用されるまでには、NO_DEBUGに基づいた定義が1つしかなく、見たようにすべての印刷または印刷が行われません。