gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:28:37 25 4
gpt4 key购买 nike

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

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

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

  3. structalign(t) 的值其中 t是结构或 union 或数组类型是 structalign(m) 的最大值其中 mt 的成员类型.

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

最佳答案

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

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

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

关于c - C 编程语言的哪些实现违反了以下假设?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com