2
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)时,它工作正常。

4

2 回答 2

15

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

如果您的static意思是该对象具有静态存储持续时间,那么全局变量(或通常在命名空间范围内的变量)无论如何都具有静态存储持续时间。你不需要标记它们static。但是,如果您删除static,您将遇到另一个问题;您将有多个a跨翻译单元的定义。

正确的方法是aextern文件FileA.hpp中声明:

extern int a;

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

int a;

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

于 2013-04-18T09:33:02.403 回答
3

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

于 2013-04-18T09:31:17.580 回答