【问题标题】:Global variables with internal linkage in inline functions内联函数中具有内部链接的全局变量
【发布时间】:2018-11-02 08:44:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ global-variables inline-functions


    【解决方案1】:

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

    它的行为是不确定的。

    【讨论】:

    • 您的意思是以下语句吗:可以有多个定义...只要以下所有条件为真:...从每个定义中查找名称都相同实体?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多