POSIX standard为C语言添加了许多库函数和其他标识符。在dlsym()
函数的描述中,它(我强调)说:
概要
#include <dlfcn.h> void *dlsym(void *restrict handle, const char *restrict name);
描述
dlsym ()函数应获取符号的地址 (函数标识符或数据对象标识符) ...
C标准并不保证函数指针可以转换为void *
,甚至不能保证指针的大小相同。这有效地增加了对C类型系统的额外限制。
我的问题是:
sizeof (function pointer) > sizeof (void *)
的系统上实现吗?
dlsym()
function 答案 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扩展的实现可以 要求void *类型的对象可以保存指向a的指针 功能。将指针转换为函数的结果 指向另一种数据类型(void *除外)的指针仍未定义, 然而。请注意,符合ISO C标准的编译器是 如果从void *指针转换,则需要生成警告 尝试使用函数指针,如下所示:
fptr = (int (*)(int))dlsym(handle, "my_function");
由于此处提到的问题,未来版本可能会添加新版本 函数返回函数指针,或者当前界面可能是 不推荐使用两个新函数:一个返回数据 指针和另一个返回函数指针。