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

令牌序列相同但底层类型不同的类是否违反C++单一定义规则?

问题解答

这段代码明确违反了One Definition Rule(ODR,单定义规则),具体违反的是ODR中关于类定义一致性的核心要求:

  • ODR规定,同一个类在多个翻译单元中的定义必须语义完全一致,不仅仅是令牌序列相同。虽然你的代码里类C的令牌写法在所有翻译单元里看起来一样,但int_t在不同单元里被typedef成了完全不同的类型——int和int*,这直接导致类C的成员i的类型、大小、对齐方式在不同翻译单元里完全不同,类C的内存布局也就不一致了。
  • 从标准层面看,ODR要求类的每个定义中,对应的标识符必须指代相同的实体(这里就是int_t必须是同一个类型),显然你的代码不满足这一点。

即使编译器没有报错,这种代码会导致未定义行为:比如在一个翻译单元里创建的C对象,在另一个单元里访问时,会因为内存大小不匹配出现越界读取、数据错乱,或者调用成员函数时参数传递错误等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:11