【问题标题】:Conflict between global variables c/c++全局变量c/c++之间的冲突
【发布时间】:2014-06-19 10:30:09
【问题描述】:

我正在使用两个文件“.h”,其中有 3 个同名的全局变量。

我们假设有这些文件:

  • A.h => 里面有“union var1”、“union var2”和“#define LENGTH 20”。
  • B.h => 里面有“union var1”、“union var2”和“#define LENGTH 60”。
  • C.h => 同时导入 A.h 和 B.h。

当我编译 C.h 时,我有一个相同变量名称冲突的错误原因。

我不想修改它们的名称,因为它们在公共图书馆中(我想按原样使用它们!)。 这是我的问题。 有人能帮我吗?谢谢。

【问题讨论】:

  • 你能发布一些代码sn-ps吗?
  • 通过同时标记cc++,您很难给出好的答案。您问的是哪种语言?
  • @DavidSchwartz,实际上是 C++。

标签: c++ global-variables conflicting-libraries


【解决方案1】:

隔离每个公共库,这样您就不需要将两个头文件都包含在任何单个文件中。文件可能使用一个库,也可能使用另一个库,但不能同时使用两者。您需要为您需要的功能创建包装器,包装最容易包装的库,并在使用其他库的代码中使用您的包装器,而不是直接使用库。

【讨论】:

  • 好的,但是你能给我看一些这个“包装器”的例子吗?看不懂!
  • “包装器”是一个调用一个或多个其他函数的函数,在这种情况下,是库中的函数。您的包装函数及其参数将在其自己的头文件中定义。因此,不要调用包装函数,这需要你包含一个导致你出现问题的头文件,你所有的包装函数,它都没有。基本上,包装器提供完全不同的界面的相同功能——在这种情况下,您可以设计一个。
【解决方案2】:

首先,严格来说,头文件(“.h”)永远不会被“编译”,所以没有When I compile C.h这样的东西。只有.cpp 文件,当然包含这些头文件会被编译。

其次,如果你的程序需要包含两个引用同名的不同变量的头文件,那么你可能有一些糟糕的设计问题。

第三,我认为(?,不要经常使用联合...)您需要为联合定义一个名称。

否则,解决方案可能是定义不同的命名空间来区分两者:

// A.h
namespace aa {
    union myType { int m1; float m2; }
    myType var1;
}

.

// B.h
namespace bb {
    union myType { int m1; float m2; }
    myType var1;
}

.

// C.cpp
#include "A.h"
#include "B.h"

...
    aa::var1.m1 = 1;
    bb::var1.m1 = 2;

【讨论】:

  • @juanchopanza 随时纠正,你明白了...... ;-)
  • 好吧,不,如果你发布答案,得到正确的语法!
  • @Lightness Races in Orbit,好吧好吧,我虽然这是一个协作网站,抱歉 ;-) 现在我认为我的回答是正确的。但是从投票中,我知道最好发布一个没有代码示例的总体方向的答案,而不是发布一个详细的答案;-)
  • @Lightness Races in Orbit:是的,但恕我直言,这并不是真正的 SO 目的:在目前的情况下,显然 OP 并没有从 David 的回答中得到太多帮助,尽管它在技术上是正确的。但事情就是这样……
  • 关于糟糕的设计问题:您并不总是有选择的余地。当我开始 C++ 时,USL 库被广泛用于它的类String(除其他外),当然,GUI 软件通常必须包含X.h。其中有一个#define String ...
【解决方案3】:

试试这个:

LIB_FILE.H

extern union_type var1; // declaration
extern union_type var2; // declaration 

LIB_FILE.cpp

union_type var1;  // definition
union_type var2;  // definition

文件 A.H

#include "LIB_FILE.H"

文件 B.H

#include "LIB_FILE.H"

文件 C.H

#include "A.H"
#include "B.H"

你需要区分声明和全局变量的定义。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多