gpt4 book ai didi

c++ - 获取通过宏生成的函数的地址

转载 作者:行者123 更新时间:2023-11-30 02:01:00 26 4
gpt4 key购买 nike

我尝试使用通过宏生成函数的代码,如下所示:

文件A(提供的文件我不能在这里改变任何东西):

#define FUNCTION_GENERATOR(NUM) \
void MyGeneratedFunctionNo##NUM##(void) \
{ \
another_function_call(NUM); \
} \

FUNCTION_GENERATOR(1)
FUNCTION_GENERATOR(2)
FUNCTION_GENERATOR(3)

文件 B(我的文件,我想在其中使用指向文件 A 生成的函数的函数指针):

typedef void (*function_ptr) (void);
function_ptr func_array[3];
func_array[0] = MyGeneratedFunctionNo1;
func_array[1] = MyGeneratedFunctionNo2;
func_array[2] = MyGeneratedFunctionNo3;
...

编译器自然会提示 MyGeneratedFunctionNo1、MyGeneratedFunctionNo2、MyGeneratedFunctionNo3 未定义。

有什么方法可以使用函数指针吗?生成函数?

最佳答案

这个问题与函数指针本身无关。您将无法以任何方式从其他翻译单元访问这些函数,无论是否使用指针,因为它们未在其他翻译单元中声明。

典型的基于宏的技术意味着提供和使用两个宏:一个用于生成声明,一个用于生成定义

#define FUNCTION_GENERATOR_DECL(NUM) \
void MyGeneratedFunctionNo##NUM(void);

#define FUNCTION_GENERATOR_DEF(NUM) \
void MyGeneratedFunctionNo##NUM(void) \
{ \
another_function_call(NUM); \
}

之后你在一些实现文件中使用“定义”宏实例化(就像你已经做的那样)

FUNCTION_GENERATOR_DEF(1)
FUNCTION_GENERATOR_DEF(2)
FUNCTION_GENERATOR_DEF(3)

并且您通常将“声明符”宏实例化放入某个头文件中。

FUNCTION_GENERATOR_DECL(1)
FUNCTION_GENERATOR_DECL(2)
FUNCTION_GENERATOR_DECL(3)

P.S. 另外,请注意@James Kanze 在评论中提到的一个重要的微妙点(我一开始就错过了)。 ## 运算符不得用于形成无效的预处理标记。在预处理器语法中 ( 是一个单独的独立预处理标记(标点符),而函数名也是一个单独的独立预处理标记(标识符)。如果您试图将函数名强行连接到 ( 通过使用 ## 运算符,您最终会得到无效的预处理 token 和未定义的行为。

不要将 ( 连接到函数名称。从您的宏定义中删除第二个 ##。没有它它会按预期工作。

关于c++ - 获取通过宏生成的函数的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com