在内联函数中具有内部链接的全局变量

Global variables with internal linkage in inline functions

我有一个 val.h 源代码文件,其中包含带有内部链接和内联函数的全局变量 returns 其地址:

// val.h
#pragma once
static int val;
inline int* get_val()
{
  return &val;
}

然后这个header包含在两个不同的翻译单元中。如果我在这两个单元中调用 &val,我会得到两个不同的地址,这没关系,因为 val 有一个内部链接,每个翻译单元都有自己的 val。但是如果我在这两个单元中调用 get_val(),我会得到两个相同的地址。

标准是否保证这种行为,我们是否总是从任何翻译单元获得 get_val() 调用返回的相同值?

如果编译器决定进行真正的内联,即仅用每个翻译单元中的 &val 语句替换 get_val() 调用,会怎样?在这种情况下,我们会为每个翻译单元获得不同的地址吗?

您的函数违反了 One Definition Rule,因为表达式 val 指的是不同翻译单元中的不同实体。

其行为未定义。

如您所见,当您将此头文件包含在两个不同的翻译单元中时,您将得到未定义的行为。这是因为表达式 return &val 将引用两个不同的对象;因此,getVal 的正文在两个翻译单元中是不同的,但 getVal 具有外部链接。所以你违反了一个定义规则。

要克服这个问题,您还必须为 getVal 定义内部链接,即写 static int* get_val() { ...。单独使用关键字 inline 不会定义外部或内部链接。