2017-01-12 5 views
0

Мы пытаемся скомпилировать программу на машине серии Tandem X, но мы получаем ошибки в форме «Недопустимое дублирующее определение инициализированный элемент данных на C и/или C++ ". Этот же код успешно компилируется для нас на машине серии Tantem S.Ошибка: (Неверное дублирующее определение инициализированного элемента данных) в серии Tandem X для кода C++

Мы имеем следующие структуры файла:

/---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 серии
  • Linker используется XLD (НЛД не доступен на этой серии)

ответ

4

Каждая единица компиляции - грубо говоря, один исходный файл и все файлы, прямо или косвенно #include г в него - составляется отдельно. Поэтому, если вы включите ваш конкретный заголовок в два отдельные файлы, оба компилировать заявления

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

Поскольку они не объявлены extern, они представляют собой определение этих объектов. В результате каждый файл, содержащий заголовок, содержит определение каждого из этих объектов, и каждый объектный файл имеет свою собственную версию каждого из них. C++ разрешает несколько объявлений одного и того же объекта, но только одно определение в каждой полной программе. Поскольку каждый из ваших модулей имеет определение gAddressMap и gAddressIterator, вы не можете создать соответствующую программу, которая объединяет эти два.

Решение состоит из двух частей. Во-первых, вы должны убедиться, что объявления заголовочного файла не являются определениями.Это достигается путем объявления их extern:

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

Во-вторых, вы должны поставить реальные определения где-то, в точности один файл среди всех тех, кого вы намерены объединить в одну программу. Если есть исходный файл, содержащий функции для инициализации или иного управления этими объектами, то это будет многообещающим местом, но не заголовочным файлом, который может включать несколько других файлов.

2

Для моей точки зрения, вы должны объявить в заголовок передайте ваши глобальные переменные с помощью классификатора extern, потому что эта глобальная переменная распределяется между несколькими файлами C.

extern gAddress gAddressMap; // define variable