在 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;

然后externstdafx.h

extern bool MyBool;

【讨论】:

以上是关于在 C++ DLL 中使用全局变量的主要内容,如果未能解决你的问题,请参考以下文章

QLibrary Visual C++ 全局变量

C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

易语言 程序怎样使用dll中的全局变量

C++ 静态库中的共享全局变量

如何从 DLL 中检索数组变量? (视觉 C++)