静态变量cpp不想改变

时间:2013-04-18 09:27:57

标签: 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)时,它可以正常工作。

2 个答案:

答案 0 :(得分:12)

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

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

执行此操作的正确方法是在a文件中将extern声明为FileA.hpp

extern int a;

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

int a;

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

答案 1 :(得分:3)

您在头文件中声明a,其中包含该文件时会创建两个副本,一个在main.cpp中,一个在FileA.cpp中。执行a = 5;时,您从main.cpp分配副本,而在调用函数change时,它会更改FileA.cpp中的副本。