0

0

C++ inline变量是什么 C++17头文件定义全局变量免ODR违规【新标准】

穿越時空

穿越時空

发布时间:2026-01-24 11:19:02

|

816人浏览过

|

来源于php中文网

原创

inline变量解决头文件中定义全局变量引发的ODR违规问题:C++17前多TU包含导致链接时multiple definition错误,C++17引入inline变量允许头文件中定义且各TU共享同一实例。

c++ inline变量是什么 c++17头文件定义全局变量免odr违规【新标准】

inline变量解决什么问题

头文件里定义全局变量,以前会触发ODR(One Definition Rule)违规:每个包含该头文件的编译单元都生成一份定义,链接时报 multiple definition 错误。C++17 引入 inline 变量,让编译器允许在多个 TU 中“重复定义”,只要定义完全一致,就只保留一份实例。

怎么声明和定义 inline 变量

必须同时满足:声明带 inline、定义也在头文件中、且只能有一份定义(不能在 .cpp 里再定义)。常见写法是直接在头文件里完成声明+定义:

// config.h
inline int global_counter = 0;
inline const std::string app_name = "myapp";
  • inline 必须出现在变量定义处(不是仅声明),且不能和 extern 共存
  • 可以是 const 或非 const,但非 const 的 inline 变量仍需注意多线程并发修改问题
  • 类内静态成员变量也可以用 inline(C++17 起),避免在 .cpp 中单独定义

inline 变量和 extern inline 函数的区别

函数加 inline 是建议编译器内联,不解决 ODR;而变量加 inline 是明确要求链接器合并多份定义。两者语义完全不同:

  • inline void f() { } —— 多个 TU 包含它不会报错,但它是函数,不是变量
  • inline int x = 42; —— 多个 TU 包含它也不会报错,且所有 TU 看到的是同一个对象地址
  • 不能写 extern inline int x; —— 这是非法组合,inline 变量不允许 extern

容易踩的坑和兼容性注意点

不是所有场景都适合 inline 变量,尤其涉及初始化顺序或跨 shared library 时:

IBM Watson
IBM Watson

IBM Watson文字转语音

下载

立即学习C++免费学习笔记(深入)”;

  • 不同动态库中定义同名 inline 变量,行为未明确规定,可能产生多个副本(取决于链接器和 ABI)
  • 初始化依赖其他 TU 的全局变量时,仍存在静态初始化顺序 fiasco 风险,inline 不改变这一点
  • 低于 C++17 的标准(如 C++14)不支持,MSVC 2017 / GCC 7 / Clang 5 起才稳定支持
  • 模板静态数据成员默认就是 inline 的(C++17 起),所以 template inline T value = {}; 是合法的,但老代码里常靠特化 + .cpp 定义绕过

真正要用好 inline 变量,得清楚它只是 ODR 的补丁,不是万能单例替代品——尤其是当变量需要运行期唯一性保证,或者要被 dlopen 的模块访问时,还是得回归 extern + 单独定义的老路。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.11.23

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号