ODR(单一定义规则)是C++强制要求的底层契约:同一实体在整个程序中必须有且仅有唯一合法定义,违反则行为未定义;约束非内联函数、全局变量、类、模板、概念等,分“全程序唯一定义”和“每翻译单元字面一致定义”两类。

ODR(One Definition Rule,单一定义规则)不是“建议”,而是 C++ 标准强制要求的底层契约:**同一个实体,在整个程序中如何被定义,有且仅有明确、唯一的合法方式;违反它,程序行为未定义——编译器可以不报错,但运行结果不可预测。**
以下实体都必须遵守 ODR,包括但不限于:
ODR 的实际执行分两个层级,不能混为一谈:
int g_val = 42;,又在 b.cpp 里再写一遍,链接时会报 “multiple definition” 错误。这是 ODR 出错的高发区:
立即学习“C++免费学习笔记(深入)”;
extern int x;、class A;、void foo();
int x = 0;、class A { int m; };、void foo() { }
struct B {};);const int N = 5; 是定义(有初始化),而 extern const int N; 只是声明。这些错误看似小,却直接触发 ODR 违规:
int helper = 0; 并被多个 .cpp 包含 → 改成 inline int helper = 0;(C++17)或移到单个 .cpp 中定义 + 头文件用 extern 声明inline void log() { std::cout 和 <code>inline void log() { std::cout → 链接后行为未定义,必须保证所有 TU 中 inline 函数定义逐字符相同
constexpr 函数写在头文件里没问题(隐式 inline),但若加了 static 修饰,就变成内部链接,各 TU 独立一份——此时不参与跨 TU 的 ODR 检查,但也不共享行为以上就是c++++ ODR是什么 c++单一定义规则详解【核心】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号