无法将宏定义传递给基类

时间:2017-02-27 19:07:18

标签: c++ c++14

基类在创建派生类对象时无法查看派生类中定义的宏。 [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() {}
};

因此,每当我创建Derived类的对象时,我都不希望在输出终端中看到Bing,因为我已经定义了宏SKIP

但这不会发生。似乎Base类对宏SKIP的定义毫无头绪。有没有办法做到这一点,或者如果不用-DSKIP标志编译代码就不可能做到这一点?

2 个答案:

答案 0 :(得分:7)

首先,不要使用宏。

其次,SKIP将在处理Base的类声明时检查定义,而不是在Derived的类声明处理时,所以如果你#define它在哪里,现在为时已晚。你需要提前做到这一点:

#define SKIP
#include "Base.hpp"

class Derived : public Base { ... };

但请确保在每次加入SKIP之前定义或不定义Base,或者是ODR违规。或者只是在命令行上定义它。

但是,实际上,不要使用宏。通过bool

答案 1 :(得分:1)

您可以使用模板而不是宏:

template<bool skip>
struct Base {};

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

然后,在创建Derived课程时,您可以这样做:

struct Derived : Base<true> {};

如果您将true作为模板参数,它将选择输出Bing的其他基类。