基类在创建派生类对象时无法查看派生类中定义的宏。 [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
标志编译代码就不可能做到这一点?
答案 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
的其他基类。