覆盖基类中的编译器宏

时间:2018-01-15 21:16:07

标签: c++ directive

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

#define PRODUCT "NEW PRODUCT D"

用于多个输出等。我现在从B派生出D类,并用

代替宏
awk

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

3 个答案:

答案 0 :(得分:2)

埃德加答案的变体,根据你想要完成的事情,这可能更合适或更不合适:

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";
  }
};

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

答案 1 :(得分:1)

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

我建议使用静态成员:

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";

现在,您可以在PRODUCTBase课程中使用Derived

答案 2 :(得分:0)

  

为什么要在C ++中避免使用宏

宏跨越范围边界,正如您的示例描述大声报告。

  

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

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

  

有办法做到这一点吗? [重新定义宏以仅在需要时进行更改]

可能......你能可靠吗" #undef PRODUCT"就在定义第二个" #define PRODUCT ..."之前并且没有您想要第一个定义的代码所见的第二个定义。

考虑:

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

#define PRODUCT "MY PRODUCT B"

// zone a

#undef  PRODUCT


#define PRODUCT "NEW PRODUCT D"

// zone b

#undef  PRODUCT

将与定义相对应的代码放入适当的区域。

一个解决方案:

我的第三方代码包含与我的符号名称相混淆的宏,我感到非常惊讶。它好像已经定义了具有常用含义的宏,如:open,close,read,write等。我的方法" Foo_t :: open()"等等会被踩到。

我通过

解决了这个问题(也许是笨拙的)
  • 仅在一个cpp中包含第三方标题,以便' macros'我确实使用过只是由我编写的代码调用来使用它,而不是在任何其他编译单元中。 (即我控制了通过#include引入宏的位置。)

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