小编典典

内联变量如何工作?

all

在 2016 年 Oulu ISO C 标准会议上,一项名为Inline Variables的提案被标准委员会投票通过了 C17。

通俗地说,什么是内联变量,它们是如何工作的,它们有什么用?内联变量应该如何声明、定义和使用?


阅读 66

收藏
2022-08-19

共1个答案

小编典典

提案的第一句话:

”说明inline符可以应用于变量以及函数。

inlineas
应用于函数的保证效果是允许在多个翻译单元中通过外部链接对函数进行相同的定义。对于意味着在标题中定义函数的实践,可以包含在多个翻译单元中。该提案将这种可能性扩展到变量。

因此,实际上(现在已接受)提案允许您使用inline关键字在头文件中定义外部链接const命名空间范围变量或任何static类数据成员,以便在包含该头文件时产生多个定义链接器可以使用多个翻译单元
- 它只是选择 其中一个

直到并包括 C++14 在内,用于此的内部机制一直存在,以支持static类模板中的变量,但没有方便的方法来使用该机制。一个人不得不诉诸诸如

template< class Dummy >
struct Kath_
{
    static std::string const hi;
};

template< class Dummy >
std::string const Kath_<Dummy>::hi = "Zzzzz...";

using Kath = Kath_<void>;    // Allows you to write `Kath::hi`.

从 C++17 及以后,我相信一个人可以只写

struct Kath
{
    static std::string const hi;
};

inline std::string const Kath::hi = "Zzzzz...";    // Simpler!

‘在头文件中。

该提案包括措辞

„„„„ „„n
内联静态数据成员可以在类定义中定义,并且可以指定„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
如果使用说明符声明该成员constexpr,则可以在没有初始化程序的名称空间范围内重新声明它(此用法已弃用,请参见“DX”)。其他静态数据成员的声明不应指定一个“种族或种族平等”

‘这使得上述内容可以进一步简化为

struct Kath
{
    static inline std::string const hi = "Zzzzz...";    // Simplest!
};

‘ 正如 TC 在对此答案的评论中所指出的那样。

此外,修饰符鈥媍onstexpr意味着静态数据成员以及函数。inline


注意:
鹿对于一个函数inline也有一个关于优化的暗示作用,编译器应该更喜欢用直接替换函数的机器代码来替换这个函数的调用。这个提示可以忽略。

2022-08-19