Найден один или несколько кратно определенных символов C++
У меня есть файл заголовка и 5 различных файлов C++, и мне нужно, чтобы этот заголовок был включен во все мои файлы C++. Я не объявлял какие-либо файлы cpp с включением "x.cpp". Кто-нибудь знает, как я могу это исправить?(У меня 6 заголовков и 5 cpp, поэтому я не переписывал весь код.)
#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" (?loopi@@3HA) already defined in arraylistc.obj
1>linkedlistc.obj : error LNK2005: "int LOOPCOUNTER" (?LOOPCOUNTER@@3HA) already defined in arraylistc.obj
1>main.obj : error LNK2005: "int loopi" (?loopi@@3HA) already defined in arraylistc.obj
1>main.obj : error LNK2005: "int LOOPCOUNTER" (?LOOPCOUNTER@@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>
2 ответа
Я думаю, что заголовочный файл должен иметь только объявления переменных. Вы должны поместить определения в соответствующий файл cpp. Что-то вроде этого:
// header file
#ifndef _UTIL_H_
#define _UTIL_H_
extern int LOOPCOUNTER;
#endif
// cpp file
// ...
int LOOPCOUNTER = 0;
Предполагая, что вы получаете жалобы компоновщика на символы, ваша проблема, вероятно, состоит в том, что ваши заголовки включаются несколько раз. Вы не должны допустить, чтобы это произошло.
Типичное решение состоит в том, чтобы использовать защиту включения как это:
#ifndnef MYHEADER_H
#define MYHEADER_H
//header code here
#endif
Это обеспечит включение вашего заголовка только один раз.
Кроме того, вы никогда не должны #include
файлы cpp, только заголовки.
С другой стороны, если включить защиту не помогают, то у вас есть заголовочные файлы, которые определяют символы, а не объявляют их. Не делай этого. Смотрите этот вопрос о том, как обрабатывать глобальные данные, не определяя их в заголовках.