extern变量在visual studio中重置

时间:2018-01-24 08:59:21

标签: c++ global-variables extern

考虑以下示例:

// header props.h

#pragma once
#include <vector>
extern std::vector<int> prop;
struct addToVec
{
    addToVec(int a)
    {
        prop.push_back(a);
    }
};

// cpp文件props.cpp

#include "props.h"
std::vector<int> prop;
addToVec b(10);

// main.cpp

#include <iostream>
#include "props.h"
addToVec a2(14);
int main(int argc, char** argv)
{
    std::cout << prop.size();
    return 0;
}

预期输出为2.但实际输出为1.

这给出了gcc编译器的预期结果(2)(不确定版本)。我正在使用visual studio professional 2013版本12更新5.这是错误还是预期的结果?

元素添加到向量的顺序与我无关。我唯一担心的是,向量中只添加了一个元素(而不是2)。

3 个答案:

答案 0 :(得分:4)

虽然初始化顺序在单个translation unit内定义明确,但在翻译单位之间

这意味着您无法控制是否在 prop之前构建和初始化a2

避免全局变量的另一个原因。

答案 1 :(得分:2)

要计算静态初始化排序,您可以使用具有静态成员的函数:

// header props.h

#pragma once
#include <vector>
std::vector<int>& getProp();
struct addToVec
{
    addToVec(int a)
    {
        getProp().push_back(a);
    }
};

// cpp file props.cpp

#include "props.h"
std::vector<int>& getProp(){
    static std::vector<int> prop;
    return prop;
}
addToVec b(10);

通过这种方式,prop仅在需要时创建。

答案 2 :(得分:1)

这是“静态初始化订单Fiasco”的一个实例 - 请参阅例如static initialization order fiasco

非本地对象的初始化顺序未在C ++中定义,因此在这种情况下,您不能依赖于prop与a2的初始化顺序。您必须选择一个(或两个)在您的控制下显式初始化,而不是依赖于未定义的顺序。