c - 将函数地址存储到全局变量中

标签 c

考虑以下代码:

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/

相关文章:

c - 为什么我们在嵌入式c程序的末尾使用空while(1)?

c - 如何在 C 中生成 -1 和 1 之间的随机数?

将指向结构的指针转换为指向带有 const 成员的结构的指针

c - 在 C 中为二叉树实现 'insert' 函数

c - heapusage 检测到可能由 printf 引起的内存泄漏

c - O_NONBLOCK 意外行为

按位运算中的字符转换

C 从命令行读入数学方程式

C - 如何正确使用SIGUSR1?

c - 分配一个不同对待的值