我的C代码中有一个函数注册表,我必须提供一个 API 以在编译时将自定义函数注册到注册表。
示例:代码的“客户”端应如下所示:
int a_test_function_a(){
return 13;
}
int init(void){
add_command(a_test_function_a);
}
在我的注册表代码中,我定义了这个宏:
#define add_command(NAME) do{ \
command_registry = avl_tree_add( \
command_registry \
, #NAME \
, &##NAME \
, &command_handler); \
} while(0)
这是我不明白的。gcc -E 的输出替换了预期的字符串:
do{ command_registry = avl_tree_add( command_registry , "a_test_function_a" , &a_test_function_a , &command_handler); } while(0);
但是编译器会抛出一个错误:
src/commands/commandRegisterTest.c:18:5: error: pasting formed '&a_test_function_a', an invalid
preprocessing token
add_command(a_test_function_a);
^
src/commands/../../../src/commands/command_api.h:18:8: note: expanded from macro 'add_command'
, &##NAME \
^
1 error generated.
我怎么能做到这一点,我不必add_command('name', &function);
自己打电话。我将通过它的名称注册函数并调用它add_command(name)
。除了解决方案,为什么预处理器替换行但失败?这对我来说没有任何意义。