2017-02-27 10 views
3

基本クラスは、派生クラスオブジェクトの作成時に派生クラスで定義されたマクロを表示できません。 [C++ 14]基本クラスにマクロ定義を渡すことができません

Base.HPP

class Base { 
public: 
    Base() { 
     #ifndef SKIP 
     std::cout << "Bing" << std::endl; 
     #endif 
    } 
}; 

ファイル:Derived.HPP

#define SKIP 
class Derived : public Base { 
public: 
    Derived() {} 
}; 

だから、私は私がBing中を見ることはないと予想派生クラスのオブジェクトを作成するとき私はマクロSKIPを定義して以来、出力端子。

しかし、これは起こりません。基本クラスはマクロSKIPの定義についてはわかりません。それを行う方法はありますか?これは、-DSKIPフラグでコードをコンパイルせずに行うことはできませんか?

+0

マクロを使用しないでください。 – Barry

+0

インクルードファイルは通常一度だけ処理されるため、SKIPが処理された時点でSKIPが定義されていない場合、 "Bing"は表示されません。 –

+0

マクロは、コンパイラがコードを見る前にテキスト置換を行います。人々があなたを助けることができるかもしれないならば、重要な#include * Base.HPP *の前または後にあなたが '#define' 'SKIP 'を宣言することさえできません。また、あなたはおそらく[ODR](https://stackoverflow.com/questions/4192170)に違反していて、[UB]へ行く途中です(https://stackoverflow.com/documentation/c%2b%2b/1812/未定義の動作#t = 201702271913219429673)。 – nwp

答えて

7

まず、マクロを使用しないでください。

第二に、SKIPBaseのクラス宣言が処理された時点で定義されたらしがチェックされます - ないDerivedのクラス宣言が処理されるとき、もしそうならあなたは#defineそれはあなたがしている、それは遅すぎるだけです。

#define SKIP 
#include "Base.hpp" 

class Derived : public Base { ... }; 

をしかし、あなたが定義したりBaseのあらゆる含める前にSKIPを同じように定義していないことを確認し、またはそれはODR-違反です:あなたは道先にそれを行う必要があります。あるいは単にコマンドラインで定義してください。

しかし、実際にはマクロは使用しないでください。 boolを渡してください。あなたのDerivedクラスを作成するときに、あなたがこれを行う、その後

template<bool skip> 
struct Base {}; 

template<> 
struct Base<false> { 
    Base() { 
     std::cout << "Bing" << std::endl; 
    } 
}; 

+0

本当に本当に本当にマクロを使用しなければならない場合は、長い醜い名前にして、そこから何か他のものと衝突しないようにします。 g。 "SKIP_COUT_IN_THIS_CLASS_OF_MY_SUPER_COOL_LIBRARY" ;-) – zett42

1

あなたは、テンプレートの代わりにマクロを使用することができます

struct Derived : Base<true> {}; 

テンプレートパラメータとしてtrueを入れた場合、それが選択されます他の基本クラスはBingを出力します。

+0

downvoterに:私の答えに何が間違っていますか?私はOPが彼が望むものを達成できる別の方法を示すことを試みている。私の答えを改善する方法はありますか? –

関連する問題