Error: (Illegal duplicate definition of the initialized data item) on Tandem X series for C++ Code

Error: (Illegal duplicate definition of the initialized data item) on Tandem X series for C++ Code

我们正在尝试在 Tandem X 系列机器上编译程序,但出现 "Illegal duplicate definition of the initialized data item in C and/or C++ " 形式的错误。同样的代码在 Tandem S 系列机器上为我们编译成功。

我们有以下文件结构:

/---AddressMap.h----/

#ifndef ADDRESSMAP // Header file macro
#define ADDRESSMAP  // Header file macro    
typedef map<long,char*,less<long> > gAddress;  data type
gAddress::iterator gAddressIterator;  // define iterator
gAddress gAddressMap;  // define variable    
#endif//ADDRESSMAP

/*file1.cpp:-> 使用 AddressMap 的第一个文件 */

#include "AddressMap.h"   // include file

/*file2.cpp:-> 第二个文件也使用 AddressMap */

#include "AddressMap.h"     // include file

问题

两个文件都编译成功,但将它们链接在一起失败并显示...

Illegal duplicate definition of the initialized data item gAddressMap in file1.o and in file2.o

由于两个文件都需要访问这个变量,所以都包含了头文件;也许这是造成错误的原因。此外,它是现有代码,因此我们希望避免对代码进行重大更改。特别是,我们希望保留相同的头文件和变量名。

我们如何解决这个错误?

串联详情:

在我看来,您应该在头文件中使用 extern 限定符声明您的全局变量,因为该全局变量在多个 C 文件之间共享。

extern gAddress gAddressMap;  // define variable   

每个编译单元——粗略地说,一个源文件和所有直接或间接#include进入其中的文件——是单独编译的。因此,如果您将特定的 header 包含到两个单独的文件中,它们都会编译声明

gAddress::iterator gAddressIterator;  // define iterator
gAddress gAddressMap;  // define variable    

因为这些未声明 [​​=13=],它们构成了那些 object 的定义。因此,每个包含 header 的文件都包含每个 object 的定义,并且每个 object 文件都有 自己的版本 每一个。 C++ 允许同一 object 的多个 声明 ,但每个完整程序中只允许一个 定义 。因为你的每个模块都有gAddressMapgAddressIterator的定义,你不能形成一个结合这两者的符合程序。

解决方案分为两部分。首先,您必须确保 header 文件的声明不是定义。您可以通过声明它们 extern:

来实现这一点
extern gAddress::iterator gAddressIterator;  // declare iterator
extern gAddress gAddressMap;  // declare variable

其次,您必须将实际定义放在某处,恰好放在您打算合并到一个程序中的所有文件中的一个文件中。如果有一个源文件包含用于初始化或以其他方式管理这些 object 的函数,那么这将是一个有前途的地方,但不是多个其他文件可能包含的 header 文件。