外部变量

时间:2018-06-01 10:00:58

标签: c++ initialization

我有3个文件,如下所示:

//1.hpp
extern int a;
//1.cpp
#include "1.hpp"
int a = 44;
//2.cpp
#include <iostream>

using namespace std;

extern int a;
int main()
{
    cout << endl << a;
    return 0;
}

上述程序给出了44作为输出。我想问一下它是否能保证输出总是44,因为对我来说这个程序工作的确切顺序并不明显,即说&#39;的初始化是正确的。一个&#39;在main函数中使用它之前会发生过吗?

2 个答案:

答案 0 :(得分:3)

是的,这可以保证在执行a之前初始化main()。对于non-local variables with static storage duration

  

具有静态存储持续时间的所有非局部变量在主函数执行开始之前被初始化为程序启动的一部分(除非延迟,见下文)。

在命名空间范围内声明的所有对象(包括全局命名空间)都有static storage duration

答案 1 :(得分:1)

有三种类型的链接符号

  • 全球符号
  • 外部符号
  • 本地符号。

链接器如何解决这些符号是一些要点。

  • 强符号(函数名称,初始化全局变量)
  • 弱符号(未初始化的全局变量)

现在符号解析规则:

规则1:不允许使用多个强符号

规则2:鉴于强符号和多个弱符号,请选择强符号

规则3:如果有多个弱符号,请选择任意一个

结论:因此 var a = 44 的值因为它是全局初始化的,并且在执行main()之前初始化了所有全局符号。