内联变量的语义

时间:2016-09-09 22:13:27

标签: c++ c++17

众所周知,对于内联函数,只要它们被调用,编译器就会“替换”它对函数的实际调用。

但是在C ++ 17中提出的内联变量呢?他们的语义是什么?

2 个答案:

答案 0 :(得分:4)

不,不能保证调用内联函数实际上会导致内联函数。例如,如果内联函数以递归方式调用自身,则可能不会内联。同样,通过函数指针变量调用通常不能内联。

如果内联函数具有外部链接,则在链接期间,如果内联函数在多个转换单元中定义,则链接器选择包含该定义的转换单元之一,并解析所有剩余引用(,即< / em> odr-使用未被编译器内联的那个函数到所选翻译单元中的定义,丢弃其余的定义。内联变量的工作方式相同。

答案 1 :(得分:1)

通常,必须定义函数和变量(为它们分配的空间,变量的空间或函数体的代码)。内联函数放宽了允许多个定义(因为定义通过包含文件被拉入多个模块),所有这些都必须相同。如果函数实际被引用,而不是内联复制,则将通过丢弃除一个副本之外的所有副本并使该副本成为二进制文件中的正式副本来合并多个定义。

内联变量对于例如。静态类成员。您可以在类头文件中定义静态成员变量,并生成多个定义(每个模块中包含一个定义,而不必创建一个类主体源文件,其唯一内容将是单个成员变量的定义)。类头)将合并到二进制文件中的单个实例中,而不会导致编译器或链接器错误。

This paper discusses it in technical detail.