将函数指针名称传递给C预处理器

将函数指针名称传递给C预处理器,c,function-pointers,c-preprocessor,C,Function Pointers,C Preprocessor,我的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

我的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_命令('name',&function)我自己的。我将按函数名注册函数,只需调用
add\u命令(name)
即可。
除了解决方案之外,为什么预处理器要替换该行,但失败了?这对我来说毫无意义

函数和函数指针通常是等价的,也就是说,您可以,而且它无论如何都会工作,但预处理器会很高兴


无论如何,您只需删除
##
操作符,它可能也会工作<代码>&var
很好,因此不需要连接。

hm,在我的情况下不需要:从宏“add_command”展开,##name苹果LLVM版本5.0(clang-500.2.75)(基于LLVM 3.3svn)顺便问一下,GCC是否编译代码(使用符号)?如果是,它可能是一个叮当作响的bug。有或没有,gcc在##名称上失败。你不需要##-省去它。你不需要##,粘贴没有意义,但是函数有意义