C++ 为什么要用内联变量

578 阅读1分钟

内联变量是一个 C++ 17 新特性

前提

我们想要在一个类里定义时初始化静态成员变量

但是

  1. C++ 里不允许在类里初始化静态成员变量
  2. 可以在类内定义,类外初始化静态成员变量,但如果被多个 cpp 文件同时包含的话又会引发新的链接错误(多次定义,预处理保护也没用)

解决方案

  • 改用常量
  • inline函数或者成员函数封装一层再返回static变量
  • 用变量模板
  • 把静态成员定义为一个模板类然后继承它

问题:

  1. 所有这些方法都会导致签名重载,可读性也会变差,使用该变量的方式也变得不同
  2. 全局变量的初始化可能会推迟到第一次使用时

使用内联变量

使用了 inline 修饰符之后,即使定义所在的头文件被多个 cpp 文件包含,也只会有一个全局对象

这样我们就可以做到追踪类而非对象,进行更细粒度的作用域控制。

struct Example{
	inline static std::string gName = "global"; 			// 整个程序一个
	inline static thread_local std::string tName = "tls";		// 每个线程一个
	std::string lName = "local";				        // 每个实例一个
}

FYI constexpr static成员现在隐含 inline

reference

《C++17 the complete guide》 by Nicolai M. Josuttis