无法将宏定义传递给基类

Unable to pass macro definition to base class

本文关键字:基类 宏定义      更新时间:2023-10-16

基类无法在创建派生类对象时查看派生类中定义的宏。[C++14]

碱性HPP

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

文件 : 派生.HPP

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

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

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

首先,不要使用宏。

其次,SKIP将在处理Base的类声明时检查定义性 - 而不是在处理Derived的类声明时,所以如果你#define它的位置,那就太晚了。您需要更早地执行此操作:

#define SKIP
#include "Base.hpp"
class Derived : public Base { ... };

但是请确保在每次包含Base之前以相同的方式定义或不定义SKIP,否则这是违反 ODR 的。或者只是在命令行上定义它。

但是,实际上,不要使用宏。传递bool.

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

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

然后,在创建Derived类时,执行以下操作:

struct Derived : Base<true> {};

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