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)时,它可以正常工作。
答案 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中的副本。