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
由于两个文件都需要访问这个变量,所以都包含了头文件;也许这是造成错误的原因。此外,它是现有代码,因此我们希望避免对代码进行重大更改。特别是,我们希望保留相同的头文件和变量名。
我们如何解决这个错误?
串联详情:
- X系列
- 使用的链接器是 xld(nld 在本系列中不可用)
在我看来,您应该在头文件中使用 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 的多个 声明 ,但每个完整程序中只允许一个 定义 。因为你的每个模块都有gAddressMap
和gAddressIterator
的定义,你不能形成一个结合这两者的符合程序。
解决方案分为两部分。首先,您必须确保 header 文件的声明不是定义。您可以通过声明它们 extern
:
来实现这一点
extern gAddress::iterator gAddressIterator; // declare iterator
extern gAddress gAddressMap; // declare variable
其次,您必须将实际定义放在某处,恰好放在您打算合并到一个程序中的所有文件中的一个文件中。如果有一个源文件包含用于初始化或以其他方式管理这些 object 的函数,那么这将是一个有前途的地方,但不是多个其他文件可能包含的 header 文件。
我们正在尝试在 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
由于两个文件都需要访问这个变量,所以都包含了头文件;也许这是造成错误的原因。此外,它是现有代码,因此我们希望避免对代码进行重大更改。特别是,我们希望保留相同的头文件和变量名。
我们如何解决这个错误?
串联详情:
- X系列
- 使用的链接器是 xld(nld 在本系列中不可用)
在我看来,您应该在头文件中使用 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 的多个 声明 ,但每个完整程序中只允许一个 定义 。因为你的每个模块都有gAddressMap
和gAddressIterator
的定义,你不能形成一个结合这两者的符合程序。
解决方案分为两部分。首先,您必须确保 header 文件的声明不是定义。您可以通过声明它们 extern
:
extern gAddress::iterator gAddressIterator; // declare iterator
extern gAddress gAddressMap; // declare variable
其次,您必须将实际定义放在某处,恰好放在您打算合并到一个程序中的所有文件中的一个文件中。如果有一个源文件包含用于初始化或以其他方式管理这些 object 的函数,那么这将是一个有前途的地方,但不是多个其他文件可能包含的 header 文件。