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



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

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

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

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

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

您的函数违反了一个定义规则,因为表达式val引用了不同翻译单位中的不同实体。

它的行为是不明确的。

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

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

相关内容

  • 没有找到相关文章

最新更新