13

背景

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

概要

#include <dlfcn.h>

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

描述

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

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

问题

我的问题是这样的:

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

参考

4

1 回答 1

7

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

请注意,从 void * 指针到函数指针的转换如下:

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

ISO C 标准没有定义。此标准要求此转换在符合要求的实现上正确工作。

有一篇旧文章从C++ 的角度讨论这个问题,并链接到旧版本的dlsym() 参考,并有更详细的解释:

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

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

由于此处提到的问题,未来的版本可能会添加一个新函数来返回函数指针,或者可能会弃用当前接口以支持两个新函数:一个返回数据指针,另一个返回函数指针。

于 2014-12-30T14:41:37.507 回答