变量的声明
1.类外变量
// 1. 直接声明定义
// 如果被多个 cpp 包含,则链接报错 (multiple definition)
int a = 0;
// 2. static
// 内部链接 (internal linkage),即每个包含本头文件的翻译单元都有一个单独的实例,互不影响
static int a_static { 0 };
// 3. const
// 内部链接,并且无法修改
const int a_const { 0 };
// 4. extern
// 外部链接 (external linkage),即每个包含本头文件的翻译单元共享同一实例
// 仅作为变量声明,有且仅能有一个翻译单元存在变量定义
extern int a_extern;
// 5. inline (C++ 17)
// 外部链接
inline int a_inline { 0 };
// 6. inline + static (C++ 17)
// 内部链接,等价于没有 inline
inline static int a_inline_static { 0 };
2.类内变量
struct A {
// 1. 普通成员变量
// 每个实例 A 都有单独的成员 a
// 不能被静态成员函数访问
int a { 0 };
// 2. 静态成员变量
// 所有实例 A 共享成员 b
// 可以被静态和非静态成员函数访问
// 仅作为变量声明,有且仅能有一个翻译单元存在变量定义
static int b;
// 3. inline static (C++ 17)
// 静态成员变量的 inline 声明形式,声明即定义,因而不需要翻译单元
inline static int c { 0 };
// 4. 静态成员函数的内部静态变量
// 相当于静态成员变量
// 在没有 C++17 支持的情况下,变相实现不依赖翻译单元的静态成员变量
static int& get_d()
{
static int d { 0 };
return d;
}
};