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



请参阅http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html

(http://pubs.opengroup.org/onlinepubs/9699919799来自2013年的第7期,仍然如此!)

sockaddr_ storage是指被强制转换为其他结构类型,但这与ANSI和ISO C标准的混叠规则相矛盾据我所知。(对象可能无法通过指向不兼容类型的指针,但任何可以通过3种字符类型访问,并且该结构以及其第一构件是可互换的。)

我知道使用插座的做法由来已久在C被标准化之前,但POSIX应该符合实际上,它与手册中的标准相矛盾。(即使在POSIX的更新版本。)

他们为什么一开始就这么做?他们为什么不改?

标准中严格的别名规则约束用户代码,而不是实现代码。由于POSIX头和库是实现的一部分,所以POSIX和C标准之间没有实际冲突。

在开源平台中,尤其是在由不同团队开发C库和编译器的Linux中,这会给实现者带来困难,但这是他们关心的问题,而不是你的问题。例如,实现者可以:

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

最后一个选项是gcc和glibc团队如何解决sockaddr问题;看见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71255

事实上,我认为这里没有违反严格的别名规则。是的,当您调用一个函数时,您将它强制转换为不同的类型,但谁说必须通过这种类型的指针来访问它?

协议实现知道结构的正确类型,因此当它们访问该结构时,会将其转换回正确的类型。此处的转换仅用于将指针从一个例程传递到另一个例程,但转换后的类型不用于访问数据。

最新更新