找到一个或多个多重定义的符号c ++

时间:2013-08-04 15:19:31

标签: c++ header declare

我有一个头文件和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>

2 个答案:

答案 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