内联变量(C++17)
一句话
用 inline 修饰命名空间作用域的变量,允许在头文件中定义全局变量而不会产生多重定义链接错误——编译器保证整个程序只有一个实例。
头文件
无(语言特性)
核心 API 速查
| 语法 | 说明 |
|---|---|
inline T var = val; | 命名空间作用域的内联变量定义 |
inline constexpr T var = val; | constexpr 变量隐式 inline,无需重复标注 |
inline static T var = val; | 类内静态成员变量,C++17 起可在类内直接初始化 |
inline thread_local T var = val; | 配合线程局部存储 |
最小示例
cpp
// Standard: C++17
// header.h
#pragma once
#include <string>
inline const std::string kVersion = "1.0.0";
inline int kMaxRetries = 3;
// 多个翻译单元 include 此头文件,
// 链接时保证只有一个 kVersion 和 kMaxRetries 实例cpp
// main.cpp
#include <iostream>
#include "header.h"
int main() {
std::cout << kVersion << "\n"; // 1.0.0
std::cout << kMaxRetries << "\n"; // 3
}嵌入式适用性:高
- 头文件库(header-only library)的理想搭档,替代 extern 全局变量模式
constexpr变量隐式inline,嵌入式常用的编译期常量表天然受益- 消除"头文件中声明 + 源文件中定义"的样板代码
- 零运行时开销,仅影响链接阶段的符号合并
编译器支持
| GCC | Clang | MSVC |
|---|---|---|
| 7 | 3.9 | 19.1 |
另见
部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可