考虑以下代码:
void f() {};
void* v = f;
int i = f;
int main() { }
为什么将函数地址存储到 int
变量中会给我一个error :
error: initializer element is not a compile-time constant
但是对于 void*
变量则不然?
最佳答案
在文件范围(“全局”)声明的变量具有静态存储持续时间。
所有具有静态存储持续时间的变量都必须初始化为编译时常量。在 C 中,其他变量(甚至不是 const 变量)不计为编译时常量,因此会出现错误。
此外,您不能将指针分配给整数,这样做是无效的 C。您必须首先通过强制转换将指针手动转换为整数类型。
此外,转换
void* v = f;
定义不明确。 C 标准仅指定void*
和指向对象类型的指针之间的转换。
现在你应该做的是获取函数的地址:
#include <stdint.h>
uintptr_t i = (uintptr_t) f;
int main (void)
{ ...
uintptr_t
保证足够大以包含任何指针的地址。
关于c - 将函数地址存储到全局变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40869848/