作为TotW#168最初发表于2019年9月12日
由James Dennett创作
以下是使用C++17的内联变量在头文件中定义字符串常量的一种安全方法:
inline constexpr absl::string_view kHelloWorld = "Hello World。";
使用constexpr确保了初始化和销毁的安全性,使用内联则确保程序中只有一个kHelloWorld的副本。
一开始在这里使用关键字inline可能会感到奇怪,特别是如果您习惯将inline视为主要的优化提示。在头文件中使用函数的inline是一个紧密的类比;将上面的变量定义与以下内容进行比较:
inline constexpr absl::string_view HelloWorld() {
return "Hello World.";
}
但它的优势是该字符串保证每次都位于相同的内存地址。
几乎每个在头文件中定义的全局变量都应标记为inline,并且通常也应是constexpr。如果它们没有标记为inline,则每个包含该头文件的.cc文件都将有一个单独的变量实例,这可能导致不易觉察的ODR(一个定义规则)违规。
在头文件之外,没有必要将变量标记为inline。
注意:类的静态constexpr数据成员从C++17开始隐式为inline。这种特殊情况不会改变现有代码的语义,但意味着现在不需要在源文件中提供成员的单独定义。这仅适用于静态constexpr数据成员,而不适用于其他constexpr变量以及仅为静态const的数据成员。