gpt4 book ai didi

c++ - 函数外的全局静态变量不是 "staying defined"

转载 作者:太空狗 更新时间:2023-10-29 20:53:12 27 4
gpt4 key购买 nike

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

type.h

namespace type
{
static int * specialInt;
}

类型.cpp

#include "type.h"

(这是故意留空的)

Branch.h

#include "type.h"

namespace type
{
bool initInt();
}

分支.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();
}

叶.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;
}

输出是

Address from initInt(): 007F5910

Address: 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 被所有人找到并使用。

关于c++ - 函数外的全局静态变量不是 "staying defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43561104/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com