4

在 C++ 中,我想让函数在声明时作为函数指针自动添加到映射(或向量,在这种情况下并不重要),并在以后自动调用。例如,如果我正在编写单元测试框架并且我只想让用户像这样声明他们的每个单元测试,这将很有用:

UNIT_TEST_FUNCTION(function_name){

// do something 

}

相反,像这样的东西被调用

void function_name(){
  //do something
}
int temp = register_function("function_name", function_name); 

例如, register_function() 在函数指针映射中添加用户定义的函数。所以基本上,我需要一种机制,在函数定义之后添加额外的代码行,以便在定义的函数上自动执行一些操作。这可能使用宏吗?

4

2 回答 2

7

宏只能生成连续的文本块。它无法按照您在问题中显示的方式进行布局。

但是,如果您愿意重新安排一点,则可以完成。

#define UNIT_TEST_FUNCTION(function_name) \
    void function_name(); // forward declaration \
    int temp##function_name = register_function(#function_name, function_name); \
    void function_name()
于 2013-02-28T18:13:43.503 回答
1

单个预处理器宏无法执行您想要的操作,因为它只能生成单个连续的文本块。预处理器宏在某种意义上是愚蠢的,因为它们对语言一无所知——因此是“处理器宏”中的预处理器。

您可以做的是使用一对宏或宏元组来分隔测试用例映射的开始和结束,并为每个单独的测试用例使用一个宏。这些方面的东西:

TEST_CASES_BEGIN

UNIT_TEST_FUNCTION(function_name){

// do something 

}

TEST_CASES_END

Boost 单元测试工具使用与此非常相似的机制。您甚至可能(最终)发现这种设计比您试图实现的设计更具表现力。

于 2013-02-28T18:14:53.800 回答