C 编程语言的哪些实现违反了以下假设?

Which implementations of the C programming language violate the following assumptions?

我正在尝试编写一个可移植函数,根据与 scanf 完全不同的格式化字符串将二进制格式编组为结构。为此,我对平台做了一些假设,我的代码是 运行 on:

  1. structalign 宏可移植地查找标量类型的对齐方式。

    #define structalign(t) offsetof (struct{char pad; t var;}, var)
    
  2. 在一个结构中,成员t的地址是下一个空闲地址,它是structalign(t)的倍数。

  3. 其中t为结构或联合或数组类型的structalign(t)的值为structalign(m)其中m为类型的最大值t.

  4. 的成员

这些假设在哪些平台上失败了?它们中的任何一个都得到 C 标准的支持,特别是 C99 吗?我可以做出更好的假设吗?

C99 未解决对齐问题。它不支持您的 any 假设。允许实现自由支配在成员 and/or 之间的 struct 表示中插入填充 - 或不插入填充,但是他们认为合适。该标准为实现提供了足够的自由来满足其目标环境的对齐要求,但它没有提供任何基础来支持旨在探测对齐要求的 any 行为。特别是,没有 struct 成员的偏移量与其类型对象的最佳对齐方式之间的内在关系。

虽然您的代码在与许多实现一起使用时可能会正确确定对齐方式,但在许多情况下,该代码或任何基于相同概念的代码在以导致所有 struct 的模式编译时肯定会失败没有填充的表示。这种模式被许多编译器作为一个选项提供,原则上可以成为某些编译器的默认模式。

由于您为评估数据类型对齐所做的任何事情都涉及实现定义的 and/or 未指定行为,我建议您将此类机制与主要代码分开,而是将它们放在您的构建系统中(假设您正在使用自适应多平台构建系统,例如 CMake 或 GNU Autotools)。