我有一个程序,其中我全局定义的静态变量一旦离开我的"初始化函数"就不会保持初始化状态。 (不是构造函数)。这是该计划:
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()
之外未定义?
答案 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.cpp
和specialInt
中打印的Leaf.cpp
不是同一个对象。
3)...当在命名空间范围内的声明中使用时,它指定 内部联系。