【问题标题】:using global variable in dll and exe在 dll 和 exe 中使用全局变量
【发布时间】:2013-01-07 13:44:27
【问题描述】:

我在一个通用头文件中有一个全局变量。例如

commonHeader.h

int commonInt = 0;

我有 3 个 dll 项目我想在其中使用它,所以我包含上面的标题,但它给了我多次定义的错误符号,#pragma once 也不起作用。

如果我在上面创建变量 extern 并在我的 exe 中定义它,我的 dll 中会出现链接器错误。

我所有的 dll 都需要上面的标题。 我的一个 dll 需要其他 2 个 dll 的头文件(可能会包含多个符号)

如何解决上述问题,我只想要一个跨 dll 和 exe 的变量。

我在 Windows 7 上使用 VS 2010 prof。

提前致谢。

【问题讨论】:

  • 你绝对需要一个全局变量吗?为什么?

标签: c++ dll


【解决方案1】:

在头文件中包含全局变量定义违反了单一定义规则(第 3.2 节)。相反,您只在带有extern 的头文件中声明它然后在单个实现文件中定义它是正确的。

但是为了让这个工作与 dll 一起工作,您还必须将其声明为由 exe 导出并由带有__declspec(dllexport)__declspec(dllimport) 的 dll 导入,使用适当的宏来选择正确的 __declspec,具体取决于是否您正在编译 exe 或 dll。

【讨论】:

    【解决方案2】:

    您应该只在标题中声明全局变量。它们应该在实现(源)文件中定义

    在你的标题中你应该有:

    // commonHeader.h
    
    extern int commonInt;    // global *declaration*
    

    然后在一个你的实现文件中你应该有:

    // some_file.cpp
    
    int commonInt = 0;       // global *definition* (and initialisation)
    

    当然,应尽可能避免使用全局变量 - 过度使用全局变量是一种“代码异味”,但有时无法避免。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多