c - C offsetof 宏如何工作?

标签 c macros offset

Possible Duplicate:
Why does this C code work?
How do you use offsetof() on a struct?

我在互联网上读到了这个 offsetof 宏,但它没有解释它的用途。

#define offsetof(a,b) ((int)(&(((a*)(0))->b)))

它想要做什么以及使用它的优势是什么?

最佳答案

R.. 对问题第二部分的回答是正确的:在使用现代 C 编译器时不建议使用此代码。

但是要回答你问题的第一部分,它实际上在做什么:

(
  (int)(         // 4.
    &( (         // 3.
      (a*)(0)    // 1.
     )->b )      // 2.
  )
)

从内到外工作,这是......

  1. 将值零转换为结构指针类型a*
  2. 获取该(非法放置的)结构体对象的结构体字段 b
  3. 获取此b字段的地址
  4. 将地址转换为 int

从概念上讲,这是将一个结构对象放置在内存地址零处,然后找出特定字段的地址是什么。这可以让您计算出结构中每个字段在内存中的偏移量,以便您可以编写自己的序列化器和反序列化器以在结构与字节数组之间进行转换。

当然,如果您实际上取消引用零指针,您的程序将会崩溃,但实际上一切都发生在编译器中,并且在运行时没有实际的零指针被取消引用。

在大多数 C 运行的原始系统中,int 的大小是 32 位,与指针相同,所以这实际上是有效的。

关于c - C offsetof 宏如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38849515/

相关文章:

ruby-on-rails - 如何在 shoulda 宏中创建上下文

c - header 看不到宏

ios - 检查设备的 Objective-C 宏

jquery animate() 未从 FIREFOX 中的当前位置开始

unity3d - GameObject Material 中使用的移位/偏移纹理?

c - skb校验和计算功能可能导致系统挂起

c - 发送给子进程和父进程的信号

javascript - 如何修改此导航栏以仅在 100px 后向下滚动时隐藏?

c - 我怎样才能让 clang 向量化一个简单的循环?

c - 使用 getopt_long() 的段错误