我有一个头文件和5个不同的c ++文件,我需要在所有c ++文件中包含此标头。我没有声明包含“x.cpp”的任何cpp文件任何人都知道如何解决这个问题?(我总共有6个标题和5个cpp,所以我没有c / p所有代码。)
#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>
答案 0 :(得分:2)
我认为头文件必须只包含变量声明。您应该将定义放在适当的cpp文件中。 像这样:
// header file
#ifndef _UTIL_H_
#define _UTIL_H_
extern int LOOPCOUNTER;
#endif
// cpp file
// ...
int LOOPCOUNTER = 0;
答案 1 :(得分:0)
假设您收到关于符号的链接器投诉,您的问题可能是多次包含您的标头。你不应该允许这种情况发生。
典型的解决方案是使用这样的包含守卫:
#ifndnef MYHEADER_H
#define MYHEADER_H
//header code here
#endif
这将确保您的标题实际上只包含一次。
此外,您永远不应该#include
cpp文件,只能使用标题。
另一方面,如果包含警卫没有帮助,那么你有头文件定义符号而不是声明符号。不要那样做。有关如何处理全局数据而不在标题中定义全局数据,请参阅this question。