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

标签 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 = 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) 事物。 除了解决方案之外,为什么预处理器替换了行但失败了?这对我来说没有任何意义。

最佳答案

函数和函数指针通常是等效的,即你可以 simply omit the & ##无论如何它都会工作,但预处理器会很高兴。

无论如何,您只需删除 ## 运算符,它也可能会起作用。 & var 没问题,因此不需要连接。

关于c - 将函数指针名称传递给 C 预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471670/

相关文章:

c++ - 数组索引与数组元素

c++ - C++ 的 XCode 错误 "Undefined symbols for architecture x86_64"

c++ - 函数指针类型和值的部分类特化

ios - #Define 和 Float 之间的区别?

c++ - 将定义的函数片段更改为可测试函数,如何传递参数?

c - union 数据类型字段行为

c++ - 如何为类级 typedef 函数创建定义

c++ - 从 Intellisense 隐藏 C++ 代码块

c - C 中的泰勒级数(sin(240) 和 sin(300) 的问题)