重写基类中的编译器宏

Override compiler macro in base class

本文关键字:编译器 基类 重写      更新时间:2023-10-16

在我的基类 B 中.cpp我有一个宏

#define PRODUCT "MY PRODUCT B"

用于许多输出等。 我现在从 B 派生 D 类,并将宏替换为

#define PRODUCT "NEW PRODUCT D"

有没有办法做到这一点? 它只是归结为编译顺序(随机)吗?

埃德加答案的变体,根据您要完成的任务,可能更合适或更不合适:

class Base {
private:
virtual const std::string Product() const {
return "MY PRODUCT B";
}
};
class Derived {
private:
virtual const std::string Product() const override {
return "MY PRODUCT D";
}
};

如果你的回答比埃德加的更好,我宁愿你赞扬埃德加回答这个问题。

我不认为宏是实现这一目标的可靠方法。

我建议改用静态成员:

class Base {
private:
static const std::string PRODUCT;
};
const std::string Base::PRODUCT = "MY PRODUCT B";
class Derived {
private:
static const std::string PRODUCT;
};
const std::string Derived::PRODUCT = "MY PRODUCT D";

现在,您可以在Base类和Derived类中使用PRODUCT

为什么在C++中应该避免宏

宏跨越作用域边界,正如示例说明大声报告的那样。

它只是归结为编译顺序(随机)吗?

我从来没有随机编译顺序,但我使用依赖项控制顺序的生成文件。 请注意,您的构建也应该是可重复的。

有没有办法做到这一点?[重新定义宏以仅在需要的地方更改]

可能。。。您能否在定义第二个"#define 产品......"之前可靠地"#undef 产品" 并且不让代码看到您想要第一个定义的第二个定义。

考虑:

在代码中创建两个区域...

#define PRODUCT "MY PRODUCT B"
// zone a
#undef  PRODUCT

#define PRODUCT "NEW PRODUCT D"
// zone b
#undef  PRODUCT

将与定义相对应并依赖于定义的代码放入相应的区域。


一个解决方案:

我对包含宏的第三方代码感到宏观惊喜,这些代码弄乱了我的符号名称。就好像他们定义了具有常用含义的宏,例如:打开、关闭、读取、写入等。 我的方法"Foo_t::open()"等会被踩踏。

我通过以下方式解决了这个问题(也许很笨拙)

  • 仅在一个 cpp 中包含第 3 方标头,这样我确实使用的"宏"仅由我编写的代码调用以使用它,而不是在任何其他编译单元中调用。 (即我通过 #include 控制了引入宏的位置。

  • 在下面添加一些"高级"的C ++方法,其中包括,这是使用宏的代码。 这些"更高级"的 c++ 方法是在 hpp 中声明的,并在 cpp 中定义。 其他代码使用这些方法...我想在某种意义上我"包装"了宏。