gpt4 book ai didi

c - 使用 stddef.h 的 offsetof 而不是自己滚动的可移植性

转载 作者:行者123 更新时间:2023-12-02 11:19:55 25 4
gpt4 key购买 nike

这是一个挑剔细节的问题,由三个部分组成。上下文是我希望说服一些人,无条件使用 <stddef.h>offsetof 定义是安全的,而不是(在某些情况下)滚动自己的定义。该程序完全是用普通的旧 C 语言编写的,因此在回答时请完全忽略 C++

第 1 部分:当以与标准 offsetof 相同的方式使用时,此宏的扩展是否会引发每个 C89 的未定义行为,为什么或为什么不,在 C99 中是否有所不同?

#define offset_of(tp, member) (((char*) &((tp*)0)->member) - (char*)0)

注意:程序中的人们感兴趣的所有实现都取代了标准的规则,即指针只能在指向同一个数组时相互减去,通过定义所有指针(无论类型或值如何)来指向到单个全局地址空间。因此,在争论该宏的扩展会引发未定义的行为时,请不要依赖该规则。

第 2 部分:据您所知,是否存在已发布的生产 C 实现,当提供上述宏的扩展时,(在某些情况下)的行为会与 offsetof 宏的行为不同已被使用?

第 3 部分:据您所知,最近发布的未提供 stddef.h 或未在该 header 中提供 offsetof 的工作定义的生产 C 实现是什么?该实现是否声称符合任何版本的 C 标准?

对于第 2 部分和第 3 部分,请仅在您可以指定特定实现并给出发布日期的情况下回答。陈述可能符合条件的实现的一般特征的答案对我来说没有用。

最佳答案

无法编写可移植的 offsetof 宏。您必须使用 stddef.h 提供的那个。

关于您的具体问题:

  1. 宏调用未定义的行为。不能减去指针,除非它们指向同一个数组。
  2. 实际行为的最大区别是宏不是整数常量表达式,因此它不能安全地用于静态初始化器、位域宽度等。此外还有严格的边界检查 - Type C 实现可能会完全破坏它。
  3. 从来没有任何 C 标准缺少 stddef.hoffsetof。 ANSI 之前的编译器可能缺少它,但它们有更根本的问题,使它们无法用于现代代码(例如缺少 void *const).

此外,即使某些理论上的编译器确实缺少 stddef.h,您也可以提供一个直接替换,就像人们插入 stdint.h 的方式一样与 MSVC 一起使用...

关于c - 使用 stddef.h 的 offsetof 而不是自己滚动的可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700114/

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