2016-11-24 49 views
0

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

我想是这样的:

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 

等为阅读结果。

+0

你可以使用内联名字空间 –

+0

@GuillaumeRacicot你能给我一个例子,你有什么想法。我检查出来试了一下,但没有得到任何简明的结果......谢谢。 – arapEST

+0

我喜欢,但不幸的是我的内联命名空间的经验是有限的。我只知道这里是为了“默认”选择一个嵌套的命名空间。 –

回答

0

你想做什么可以做得更简单。你不需要预处理器的全功率:

  1. 你不置标记(::是不是一个有效令牌的一部分)。您只需要在另一个宏旁边打印一个宏。

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

所以,做你想做什么,你需要的函数名传递到您的宏:

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

然后你定义的功能,如:

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

这一切都住here

+0

我仍然使用'未声明的标识符'FAKE_PREFIX__FUNCTION __'' – arapEST

+0

@arapEST,请参阅我的编辑。 – StoryTeller