gpt4 book ai didi

c++ - 静态变量 cpp 不想改变

转载 作者:太空狗 更新时间:2023-10-29 23:25:35 25 4
gpt4 key购买 nike

FileA.hpp:

static int a;
void change(int);

FileA.cpp

#include "FileA.hpp"
void change(int x) { a = x; }

main.cpp

#include "FileA.hpp"
#include <cstdlib>
#include <iostream>

int main()
{
a = 5;
std::cout<<a<<std::endl;
change(10);
std::cout<<a<<std::endl;
a = 20;
std::cout<<a<<std::endl;

system("Pause");

return 0;
}

我的输出是:

5
5
20

有人可以帮我解决这个问题吗?为什么变量'a'不想改变功能在 FileA.cpp 中。如何解决这个问题。当我在“FileA.hpp”中进行内联更改(int x)时,它工作正常。

最佳答案

全局变量上的 static 关键字提供了该变量的内部链接。这意味着任何具有该定义的翻译单元都将拥有该对象的自己的拷贝。所以 main.cpp 看到的 a 对象和 FileA.cpp 看到的是不同的对象。 change 将修改其中一个,但 main 将输出另一个。

如果您打算 static 表示对象具有静态存储持续时间,则全局变量(或一般命名空间范围内的变量)无论如何都具有静态存储持续时间。您不需要将它们标记为 static。但是,如果您删除 static,则会遇到另一个问题;您将在翻译单元中对 a 进行多个定义。

正确的做法是在 FileA.hpp 文件中将 a 声明为 extern:

extern int a;

然后在单个翻译单元中(可能在FileA.cpp中,定义对象:

int a;

这意味着任何包含 FileA.hpp 的对象都将具有 a 的声明(这很好)并且只有一个翻译单元将具有 的定义>一个。完美。

关于c++ - 静态变量 cpp 不想改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16079235/

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