- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
我的应用程序中有一个 IList 站点,并且站点有大量属性。 我想将此列表转换为 JSON,以便在类似于此的下拉列表中使用 var sites = SiteRepository.FindAll
我正在将一些代码从 bluebird 切换到原生 Promises,并且我对原生 promises 吞下错误这一事实感到相当恼火,即使没有定义 .catch() 也是如此。它使调试变得不可能,除非您在
在同步访问共享资源时,是否有理由不使用读/写锁而不是普通的互斥锁(基本上只是写锁),除了它具有比我可能需要的更多功能的哲学原因? 换句话说,如果我只是默认使用读/写锁作为我首选的同步结构,我是不是在踢
我刚进入这个元素,代码已经写好了,但我们发现了一个问题。当您单击菜单中的任何位置时,它会变成金色,您看不到菜单该部分中的任何链接。您可以再次单击它,它将返回到正常状态。这只发生在 Internet E
这是一个简单的类和简单的测试函数: #include #include namespace { using namespace std; } class NameStream {
我有一个 std::vector其中 Foo是一个包含 Foo( Foo&& ) noexcept 的类. 向容器中添加对象完美无缺,但是使用 std::vector::erase( iterator
我正在通过这段代码使用各种浏览器尝试 localStorage 和 JSON: function getStorage() { stored = JSON.pa
您可能认为此问题与 Running two projects at once in Visual Studio 完全相同.不完全是,恰恰相反。 我有一个带有两个 MVC3 项目的 VS 2010 解决
我正在制作一个网站:http://arc-angyal.hu/ 我的第一个问题是,我无法让左侧的红色 div 足够高以填充页眉和页脚之间的空间。它位于标题之后和导航之前。我已经设置: html, bo
根据 This Question ,我正在使用线程来终止用户输入的函数。我的代码看起来像: bool stopper = false; thread stopThread(userStop, &sto
我是一名优秀的程序员,十分优秀!