У меня есть файл заголовка и 5 различных файлов C ++, и мне нужно, чтобы этот заголовок был включен во все мои файлы C ++. Я не объявлял какие-либо файлы cpp с помощью include «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>
Я думаю, что заголовочный файл должен иметь только объявления переменных. Вы должны поместить определения в соответствующий файл 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, только заголовки.
С другой стороны, если включить защиту не помогают, то у вас есть заголовочные файлы, которые определяют символы, а не объявляют их. Не делай этого. Увидеть этот вопрос о том, как обрабатывать глобальные данные, не определяя их в заголовках.