c - 为什么 POSIX 与 ISO C 标准相矛盾

标签 c sockets posix strict-aliasing type-punning

查看 http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html

( http://pubs.opengroup.org/onlinepubs/9699919799 来自第 7 期 - 2013 年,仍然相同!)

sockaddr_storage 旨在转换为其他结构类型, 但这与 ANSI 和 ISO C 标准别名规则相矛盾 据我所知。 (对象可能无法通过 指向不兼容类型的指针,除了任何类型 可以通过 3 种 char 类型进行访问,并且该结构 及其第一个成员可以互换。)

我知道使用套接字的做法已经存在很长时间了 在 C 标准化之前,但 POSIX 应该符合 ISO C 实际上与其手册中的标准相矛盾。 (即使在 较新版本的 POSIX。)

他们一开始为什么要这么做? 他们为什么不改变它?

最佳答案

标准中的严格别名规则约束用户代码,而不是实现代码。由于 POSIX 头文件和库是实现的一部分,因此 POSIX 和 C 标准之间不存在实际冲突。

在开源平台中,特别是在 Linux 中,C 库和编译器是由不同团队开发的,这使实现者的生活变得困难,但这是他们关心的,而不是你的。例如,实现者可以:

  • 避免暴露标准之间的潜在冲突(即禁用严格别名优化);
  • 承认他们的实现不符合 POSIX 标准(请注意,例如,没有经过 POSIX 认证的 Linux 发行版);
  • 提供设施以确保潜在冲突的设施实际上不会发生冲突。从 C 标准的角度来看,这将是一个扩展。

最后一个选项是 gcc 和 glibc 团队解决 sockaddr 问题的方法;请参阅https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71255

关于c - 为什么 POSIX 与 ISO C 标准相矛盾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661031/

相关文章:

c - 对文件进行快速排序

c - 不同端口上的 UDP sendto 和 receivefrom

c - 为什么我们在调用bind()时将sockaddr_in转换为sockaddr?

c - 有没有一种方法可以在 POSIX 中自动增加一个信号量并减少另一个信号量?

c++ - 通过 `kill`生成的SIGSEGV是否特殊?

c - 如何使用perf分析C项目代码?

c - 帮助定位C示例代码读取lua命令行参数

c - 如何从包含字符串和 double 的 .dat 文件中读取并将 double 写入矩阵?

linux - 不能打开超过 1023 个套接字

c++ - Android NDK pthread上下文切换