POSIX对C中指针类型的限制

时间:2014-12-30 14:16:58

标签: c posix function-pointers dlsym

背景

POSIX standard为C语言添加了许多库函数和其他标识符。在dlsym()函数的描述中,它(我强调)说:

  

概要

#include <dlfcn.h>

void *dlsym(void *restrict handle, const char *restrict name);
     

描述

     

dlsym ()函数应获取符号的地址   (函数标识符或数据对象标识符)   ...

C标准并不保证函数指针可以转换为void *,甚至不能保证指针的大小相同。这有效地增加了对C类型系统的额外限制。

问题

我的问题是:

  • 对于C类型系统的这种限制是否有规范引用,或者它只能从某些库函数的描述中推断出来?
  • POSIX甚至可以在sizeof (function pointer) > sizeof (void *)的系统上实现吗?

参考

1 个答案:

答案 0 :(得分:7)

dlsym() reference表示转换不是由C标准定义的,但是符合标准的实现必须使其正常工作。因此,在无法使其工作的系统上,这将不是一个符合要求的实现,并且可能会记录下来:

  

请注意,从void *指针转换为函数指针为   在:

fptr = (int (*)(int))dlsym(handle, "my_function");
     

未由ISO C标准定义。这个标准要求这个   转换为符合实现的正确工作。

有一篇旧文章从C++ perspective谈到这一点,并链接到dlsym() reference的旧版本,并有更详细的解释:

  

ISO C标准不要求指向函数的指针可以来回转换为指向数据的指针。的确,ISO C标准   不要求void *类型的对象可以保存指向a的指针   功能。但是,支持XSI扩展的实现可以   要求v​​oid *类型的对象可以保存指向a的指针   功能。将指针转换为函数的结果   指向另一种数据类型(void *除外)的指针仍未定义,   然而。请注意,符合ISO C标准的编译器是   如果从void *指针转换,则需要生成警告   尝试使用函数指针,如下所示:

fptr = (int (*)(int))dlsym(handle, "my_function");
     

由于此处提到的问题,未来版本可能会添加新版本   函数返回函数指针,或者当前界面可能是   不推荐使用两个新函数:一个返回数据   指针和另一个返回函数指针。