我有一个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
本身不会定义外部或内部链接。