C ++命名空间作为宏值

时间:2016-11-24 16:33:58

标签: c++ macros namespaces stringification

我的C ++测试代码中有简单的委托函数。由于我不能包含原始实现.cpp文件(嵌入式文件),因此我在PC上运行的测试中使用了委托.cpp文件。我的想法是简单地使用相同的宏作为实体的主体,除了括号()和根据签名提供的参数。

我尝试过类似的事情:

void Flash::init()
{
   DELEGATE_DESTINATION();
}

bool Flash::write(args)
{
   DELEGATE_DESTINATION(args);
}

bool Flash::read(args)
{
   DELEGATE_DESTINATION(args);
}

其中

void Flash::init()
bool Flash::write(args)
bool Flash::read(args)

与嵌入式项目实施中的相同。在测试文件中,我只是将调用转发给虚假实现。我知道,一种可能的解决方案是将签名和实现包含在不使用中继的假类中。

我很难搞清楚这个宏。我试过像:

#define FAKE_PREFIX             fakes::device::Flash::
#define DELEGATE_DESTINATION    FAKE_PREFIX##__FUNCTION__

扩展为 FAKE_PREFIX__FUNCTION __

那么经过C Preprocessor, Stringify the result of a macro之后 我只能假货扩展到位。

我的目标是获得像

这样的结果
fakes::device::Flash::init

以及读取写入

1 个答案:

答案 0 :(得分:0)

您想要做的事情可以做得更简单。您不需要预处理器的全部功能:

  1. 您不会连接令牌(::不是有效令牌的一部分)。您只需要将一个宏打印在另一个宏旁边。

  2. _FUNCTION_不是预处理器宏,它是字符串文字(in gcc和其他编译器)。

  3. 所以要做你想做的事,你需要将函数名传递给你的宏:

    #define FAKE_PREFIX fakes::device::Flash::
    #define DELEGATE_DESTINATION(func)  FAKE_PREFIX func
    

    然后你定义你的功能,如下:

    bool Flash::write(args)
    {
      DELEGATE_DESTINATION(write)(args);
    }
    

    全部直播here