全局静态变量不在函数外部“保持定义”

我有一个程序,其中我定义的全局静态变量一旦离开我的“初始化函数”(不是构造函数)就不会保持初始化。 这是该计划:

type.h

namespace type
{
    static int * specialInt;
}

type.cpp

#include "type.h"

(这是故意留空)

Branch.h

#include "type.h"

namespace type
{
    bool initInt();
}

Branch.cpp

#include "Branch.h"
#include <iostream>

namespace type
{
    bool initInt()
    {
        specialInt = new int;
        *specialInt = 95;
        std::cout << "Address from initInt(): " << specialInt << std::endl;
        return true;
    }
}

Leaf.h

#include "Branch.h"
#include <iostream>

namespace type
{
    void PrintInt();
}

Leaf.cpp

#include "Leaf.h"

namespace type
{
    void PrintInt()
    {
        std::cout << "Address: " << specialInt << std::endl;
        std::cout << "Value:   " << *specialInt << std::endl;
    }
}

main.cpp中

#include "Leaf.h"

int main()
{
    type::initInt();
    type::PrintInt();
    return 0;
}

输出是

来自initInt()的地址:007F5910

地址:00000000

在它崩溃之前。 我读过关键字static让变量具有外部链接,为什么这会失败? 为什么变量在initInt()之外变得不确定?


namespace type
{
    static int * specialInt;
}

这是一个静态整数指针的定义。 命名空间范围内的static请求内部链接:包含type.h每个转换单元都获取其自己的独立版本的specialInt 。 那么当然,对其中一个specialInt的更改不会影响其他的。

你想要做的是在type.h声明变量:

namespace type
{
    extern int * specialInt;
}

...并在其中一个翻译单元中提供单一定义:

#include "type.h"

int *type::specialInt;

然后这个定义将被每个人通过type.h找到并使用。


我读到关键字static让变量具有外部链接,

不,当静态与名称空间范围内的对象一起使用时,它指定内部链接。 这意味着,在specialInt分配的Branch.cpp和在specialInt打印的Leaf.cpp不是同一个对象。

3)...当在命名空间范围的声明中使用时,它指定内部链接。

链接地址: http://www.djcxy.com/p/35331.html

上一篇: Global static variable not "staying defined" outside of function

下一篇: extern, linkage and global variables