POSIX对C中指针类型的限制

背景

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

概要

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

描述

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

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

我的问题是:

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

参考

  • C11标准(最终公开草案): n1570
  • The Open Group的POSIX标准: POSIX.1-2008
  • POSIX dlsym()函数

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"); 

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