在内联函数中具有内部链接的全局变量
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
不会定义外部或内部链接。
我有一个 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
不会定义外部或内部链接。