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

标签 c++ static-variables

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/

相关文章:

c++ - 如何在 C++ 中将数字转换为字符串,反之亦然

c++ - 为什么 setCentralWidget 不起作用?

c++ - OpenGL 的标准化坐标

java - 静态变量可以用来同步线程吗?

c - 我是否可以通过将变量设为静态来提高性能?

c++ - 在基于 Windows MFC 对话框的应用程序中,stdout 输出不显示在控制台上

c++ - 高级指针复杂的语法

java - Java-线程和静态变量

c++ - 静态变量在不同模块之间共享值

php - 在 PHP 中静态使用静态常量中的类名