本周小贴士#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的数据成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值