2013-08-04 2 views
0

У меня есть файл заголовка и 5 разных файлов C++, и мне нужен этот заголовок, включенный во все мои файлы C++. Я не объявлял CPP файлов включают в себя «x.cpp» Каждый знает, как я могу это исправить? (У меня есть 6 заголовков и 5 СРР в целом, так что я не с/р всего кода.)Найдено один или несколько символов с несколькими значениями C++

#ifdef _DEBUG 
#ifndef _UTIL_H_ 
#define _UTIL_H_ 


int LOOPCOUNTER=0; 

int loopi; 
#define LOOP LOOPCOUNTER++; 
#define MARKLOOPS (loopi=LOOPCOUNTER); 
#define PRINTLOOPS cout<<LOOPCOUNTER-loopi; 
#define PRINTALLLOOPS cout<<LOOPCOUNTER<<endl; 

#endif 



#endif 

и это сообщение об ошибке:

1>linkedlistc.obj : error LNK2005: "int loopi" ([email protected]@3HA) already defined in arraylistc.obj 
1>linkedlistc.obj : error LNK2005: "int LOOPCOUNTER" ([email protected]@3HA) already defined in arraylistc.obj 
1>main.obj : error LNK2005: "int loopi" ([email protected]@3HA) already defined in arraylistc.obj 
1>main.obj : error LNK2005: "int LOOPCOUNTER" ([email protected]@3HA) already defined in arraylistc.obj 
1>C:\Users\Eko\Documents\Visual Studio 2010\Projects\mt1\Debug\mt1.exe : fatal error LNK1169: one or more multiply defined symbols found 
1> 
+0

Включая точные сообщения об ошибках и деклараций оскорбительных было бы полезно. –

+0

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

+0

Имена, начинающиеся с символа подчеркивания, за которым следует большая буква (_UTIL_H_), и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

ответ

0

Предполагая, что вы получаете компоновщик жалобу о символах, ваша проблема, вероятно, что ваши заголовки будут включены несколько раз. Вы не должны этого допускать.

Типичное решение заключается в использовании включают охрану, как это:

#ifndnef MYHEADER_H 
#define MYHEADER_H 

//header code here 

#endif 

Это гарантирует, что ваш заголовок только на самом деле получает включен один раз.

Кроме того, вы никогда не должны #include cpp-файлы, только заголовки.

С другой стороны, если включить защитники не помогают, тогда у вас есть файлы заголовков, которые определяют символы, а не декларируют их. Не делай этого. См. this question, как обрабатывать глобальные данные, не определяя его в заголовках.

+0

Имена, начинающиеся с символа подчеркивания, за которым следует большая буква (_MYHEADER_H), и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

+0

@PeteBecker Отредактировано, у меня плохая привычка забывать об именах с одним подчеркиванием. – DUman

+0

@ user1264727 - много людей делают, поэтому у меня есть довольно консервированное напоминание ... –

2

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

// header file 
#ifndef _UTIL_H_ 
#define _UTIL_H_ 

extern int LOOPCOUNTER; 

#endif 

// cpp file 
// ... 
int LOOPCOUNTER = 0; 
+1

Или сделайте это 'static'. –

+0

Имена, начинающиеся с символа подчеркивания, за которым следует большая буква ('_UTIL_H_'), и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

+0

@James Конечно, но это зависит от цели пользователя. Статические переменные будут «локальными» для каждого файла, не так ли? – Unforgiven