【问题标题】:Using a global across multiple source files (using extern multiple times)跨多个源文件使用全局(多次使用 extern)
【发布时间】:2012-02-06 05:18:34
【问题描述】:

我有一个想要在多个文件之间共享的全局变量。让我们称之为:

库.cpp:

HookContext g_context;

然后,我还有另外两个文件希望在以下位置访问这个全局文件:

A.cpp:

extern HookContext g_context;

B.cpp;

extern HookContext g_context;

当我将所有这些文件链接在一起时,我的链接器会抱怨以下警告:

B.obj : error LNK2005: "class HookContext g_context" (?g_context@@3VHookContext@@A) 已在 A.obj 中定义

我是否错误地使用了 extern?我应该怎么做才能访问 A 和 B 中的上下文?

注意:在这种情况下,我不希望使用任何头文件来定义上下文。

谢谢

【问题讨论】:

  • 不,A 和 B 是完全不同的文件,定义了完全不同的类的行为。
  • 精彩回答here
  • AFAIK 你需要使用标题才能正确完成
  • 由于 A 和 B 使用完全相同的代码...这与使用 #include 本质上不一样吗(除了可维护性问题)?
  • 所示代码是合法的。如果把mainHookContext的定义什么都没有加到这3个单行文件中,编译链接,还有错误吗?

标签: c++ linker


【解决方案1】:

我会使用某种单例。使您能够稍后插入一些初始化或将其转换为其他内容。

库.cpp:

static HookContext g_context;
HookContext& getHookContext()
{
  return g_context;
}

A.cpp:

extern HookContext& getHookContext();

【讨论】:

    【解决方案2】:

    n.m 是正确的,上面的代码本身是正确的。 事实证明,我的其中一条线实际上是在它的末尾添加了一个额外的“()”。像这样:

    extern HookContext g_context();

    这会导致 g_context 在该翻译单元中被初始化和实例化。

    当我删除 () 时,它最终工作了。

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多