在C ++中我想创建一些函数,在声明时,会自动添加到地图(或向量,在这种情况下并不重要)作为函数指针,稍后会自动调用。例如,如果我正在编写单元测试框架,并且我只是希望用户声明每个单元测试,这将是有用的:
UNIT_TEST_FUNCTION(function_name){
// do something
}
而是这样的东西被称为
void function_name(){
//do something
}
int temp = register_function("function_name", function_name);
其中register_function()在函数指针的映射中添加用户定义的函数。基本上,我需要一种在函数定义之后添加额外代码行的机制,以便在定义的函数上自动执行某些操作。这可能是使用宏吗?
答案 0 :(得分: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()
答案 1 :(得分:1)
单个预处理器宏无法执行您想要的操作,因为它只能生成单个连续的文本块。预处理器宏在某种意义上是愚蠢的,因为它们对语言一无所知 - 因此“预处理器宏”中的预处理器。
您可以使用一对宏或宏元组来分隔测试用例映射的开始和结束,并为每个单独的测试用例分配一个宏。这些方面的东西:
TEST_CASES_BEGIN
UNIT_TEST_FUNCTION(function_name){
// do something
}
TEST_CASES_END
Boost单元测试设施使用与此非常相似的机制。你甚至可能(最终)发现这个设计比你想要实现的设计更具表现力。