在 C++ DLL 中使用全局变量
Posted
技术标签:
【中文标题】在 C++ DLL 中使用全局变量【英文标题】:Using global variables in a C++ DLL 【发布时间】:2012-01-05 18:53:12 【问题描述】:我有一个包含 3 个类的 C++ DLL。我在我的“stdafx”头文件中添加了一个静态布尔变量(因为我的所有类都包含它)并尝试使用它。虽然我所有的类都看到了我的变量,但它们似乎都有一个不同的实例。如果我在一次类中将变量设置为 true,那么我会注意到它在另一个类中为 false。有什么方法可以创建一个只能在 DLL 中用于所有类的变量?
【问题讨论】:
不是stdafx
你的MSVS预编译头文件支持吗?您是否应该不对其进行修改?
我愿意接受任何有助于解决此问题的想法。这对我来说最有意义,所以我同意了。
【参考方案1】:
好吧,您将其标记为 static
,所以这就是发生的事情。相反,在标题中将其标记为 extern
并在 one TU 中定义它。
并且不要修改stdafx
;这不是你的。使用您自己的共享标头。
【讨论】:
您可以修改stdafx.h
。文件中自动生成的注释是这样的 //stdafx.h : 标准系统包含文件的包含文件,或经常使用但不经常更改的项目特定包含文件
@Praetorian:但这似乎是一个真的坏主意。主要是因为它是由 IDE 自动生成的;你的bool
会在某个时候迷路。
它是自动生成的,但只有在您创建项目时才会生成一次,之后不会被IDE修改。我认为不可能创建自己的可与 stdafx.h 结合使用的预编译头文件,因此它可能只是唯一的选择。
它永远不会重新生成。所以没有丢失你放在那里的任何东西的风险。另一方面,我不会在其中放入任何代码或接口,只放入用于预编译的标头。
我将创建一个所有类都使用的共享头文件。谢谢【参考方案2】:
您的变量是static
,并且您在stdafx.h
中声明它,它包含在您项目中的所有源文件中。这意味着每个翻译单元都将包含其自己的变量副本,这正是您所看到的行为。
为了解决这个问题,在stdafx.cpp
中声明变量
bool MyBool = false;
然后extern
stdafx.h
extern bool MyBool;
【讨论】:
以上是关于在 C++ DLL 中使用全局变量的主要内容,如果未能解决你的问题,请参考以下文章
C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]