gpt4 book ai didi

c++ - 错误 : (Illegal duplicate definition of the initialized data item) on Tandem X series for C++ Code

转载 作者:太空宇宙 更新时间:2023-11-04 15:33:35 25 4
gpt4 key购买 nike

我们正在尝试在 Tandem X 系列机器上编译程序,但出现了“C 和/或 C++ 中已初始化数据项的非法重复定义”形式的错误。同样的代码在 Tandem S 系列机器上为我们编译成功。

我们有以下文件结构:

/---地址映射.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)

最佳答案

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

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

因为这些没有声明为 extern,所以它们构成了这些对象的定义。因此,包含 header 的每个文件都包含每个对象的定义,并且每个对象文件都有每个对象的自己的版本。 C++ 允许同一对象的多个声明,但每个完整程序中只有一个定义。因为您的每个模块都有一个 gAddressMapgAddressIterator 的定义,所以您无法形成一个将两者结合起来的一致程序。

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

extern gAddress::iterator gAddressIterator;  // declare iterator
extern gAddress gAddressMap; // declare variable

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

关于c++ - 错误 : (Illegal duplicate definition of the initialized data item) on Tandem X series for C++ Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com