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/7897877/

相关文章:

OpenGL 3/4 glVertexAttribPointer 步长和偏移计算错误

c - 段错误不会发生

c - 如果我不包含头文件会发生什么

c - 表达式必须是指向使用简单指针算法的完整对象类型的指针

c++ - 如何驯服 Windows header (有用的定义)?

ios - 自动触发滚动两个不同尺寸的uiwebview

c - ISO 9899 标准是否保留了将 _t 后缀用于标识符的任何用途?

macros - tt 元变量类型在 Rust 宏中意味着什么?

scala - Scala Async 能做 Clojure 的 core.async 能做的所有事情吗?

c - 这会产生什么输出?还请解释一下