本周小贴士#168:内联变量

作为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的数据成员。

你可能感兴趣的:(C++,Tips,of,the,Week,c++,开发语言)