【问题标题】:C++ Macro definition including dot?C ++宏定义包括点?
【发布时间】:2016-11-05 08:45:54
【问题描述】:

我有一些无法更改的 C++ 代码,只能通过更改头文件来更改。我有代码,可以编译。

问题是我定义了一个类似这样的函数指针(函数指针与我想要做的事情无关):

foo.bar();

我想用宏或其他东西将其更改为:

#define foo.bar() FunCall()

据我了解的问题是不能在宏中使用点,还有其他方法吗?

编辑:

更多信息。我得到的代码旨在运行单个实例,但是我包装代码以在一个类中运行多个实例。这让我很头疼。

我正在尝试的是使用宏和一些内联函数或完整的第三种方式:

 void function()
{
    foo.bar();
}

我需要一些可以使上述代码等同于:

void class::function()
{
    EventFuncTypedef f = foo.bar;
    (this->*f)();
}

或者

void class::function()
{
    class::FunCall();
}

上面所有代码的问题是尝试让原始代码执行选项 1 或 2。

【问题讨论】:

  • FunCall()实现函数bar()创建一个struct,并创建一个全局变量foo。然后foo.bar() 成为对FunCall() 的函数调用。好吗?
  • 你无法摆脱这个点。您只能以或多或少的创造性方式使用它。
  • 严格是不可能的,这实际上是已经存在的。我得到的代码被创建为作为单个实例运行,我试图将整个代码包装到一个用于多个实例的类中。这使成员函数指针变得复杂。我正在尝试新的创意方式来包装它
  • 我无法想象可以修改标头并重新编译但不能修改源代码的上下文。您是否知道您尝试的“解决方案”是多么邪恶和肮脏?虽然这看起来很狡猾,但有 1000 种方法可能会导致可怕的错误,让您在调试中花费数天时间。

标签: c++ c-preprocessor


【解决方案1】:

使用宏和助手:

struct FunCaller {
    static auto bar() {FunCall();}
};

#define foo FunCaller{}

【讨论】:

  • 对不起,我没有提到我把它全部包在一个类中。但也许这仍然有效?我无法预见上述行为的后果,但会尝试一下或类似的事情。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
相关资源
最近更新 更多