You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言offsetof()宏是否官方支持对union类型使用?

offsetof 对 union 类型的官方支持说明

首先直接给出结论:从C99及之后的所有正式C语言标准来看,offsetof官方明确支持union类型作为第一个参数。具体的标准演进和说明如下:

  • C90(ISO/IEC 9899:1990)版本的规范中,offsetof宏的定义确实只明确提及支持struct类型,要求第一个参数为结构类型,第二个参数为结构的成员名,没有提到union的适用场景。
  • 到C99版本标准发布时,官方已经修正了这一表述,明确规定offsetof的第一个参数可以是结构类型或者联合类型,这一规则一直延续到后续的C11、C17、C23等所有现行有效标准中。

很多早年的学习资料(包括你提到的《Modern C》部分版本的表格标注)只标注struct类型,要么是沿用了旧标准的表述习惯,要么是仅以struct作为常见使用场景举例,不代表union类型不被官方支持。

补充实际落地的情况:

  • 目前所有主流C编译器(GCC、Clang、MSVC等)都早已支持对union使用offsetof,哪怕是在默认兼容C90的编译模式下也不会抛出错误,因为这一用法实用性很高,编译器厂商在标准明确前就已经做了通用实现。
  • 从语法逻辑来看,union的所有成员偏移量固定为0,offsetof对union成员求值的结果完全确定,不存在实现歧义,使用也不会有兼容性风险。

内容的提问来源于stack exchange,提问作者cesss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:54:03