全局静态变量不是"保持定义"功能之外

时间:2017-04-22 15:36:46

标签: c++

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

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()之外未定义?

2 个答案:

答案 0 :(得分:3)

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找到并使用此定义。

答案 1 :(得分:1)

  

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

不,当static与命名空间范围内的对象一起使用时,它指定内部链接。也就是说,specialInt中分配的Branch.cppspecialInt中打印的Leaf.cpp不是同一个对象。

  

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