0

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

2 回答 2

2

我认为头文件必须只有变量声明。您应该将定义放到适当的 cpp 文件中。像这样的东西:

// header file
#ifndef _UTIL_H_
#define _UTIL_H_

extern int LOOPCOUNTER;

#endif

// cpp file
// ...
int LOOPCOUNTER = 0;
于 2013-08-04T15:31:57.087 回答
0

假设您收到有关符号的链接器投诉,您的问题可能是您的标头被多次包含。你不应该允许这种情况发生。

典型的解决方案是使用这样的包含防护:

#ifndnef MYHEADER_H
#define MYHEADER_H

//header code here

#endif

这将确保您的标题实际上只包含一次。

此外,您永远不应该#include使用 cpp 文件,只应该使用标题。

另一方面,如果包含保护没有帮助,那么您有定义符号而不是声明它们的头文件。不要那样做。请参阅此问题以了解如何处理全局数据而不在标头中定义它。

于 2013-08-04T15:23:35.333 回答