我有两个简单的文件,它们定义了一个带有C++函数的tryME类
______myclass.h________________
#pragma once
void tryME()
{
}
class myclass
{
public:
myclass(void);
myclass(void);
void callTryME();
};
_________myclass.cpp____________
#include "myclass.h"
myclass::myclass(void)
{
}
myclass::~myclass(void)
{
}
void myclass::callTryME()
{
tryME();
}这就给出了错误
1>myclass.obj : error LNK2005:"void __cdecl TryME(void)“(?TryME@@YAXXZ)已在tryout.obj 1>C:\tryout.exe中定义:致命错误LNK1169:一个或多个已找到的多定义符号
如果我将tryME()函数声明为静态函数,问题就解决了。但是为什么呢?
我知道.h文件包含在.cpp文件中,然后编译(到翻译单元中),静态变量和函数对包含在其中的整个翻译单元都是可见的,但是为什么没有“静态”关键字程序就不能工作呢?函数tryME应该是类之外的“全局”函数,因此是可见的,对吗?调用是否将"this->“放在tryME()之前?
发布于 2012-04-10 21:53:11
这是:
inline void tryME()
{
}否则,您将违反one定义规则。
在头文件中定义非inline方法将导致包含该标头的所有翻译单元导出该方法,因此出错。
发布于 2012-04-10 21:55:04
它确实是可见的。它在加载头文件的每个文件中都是一个单独的定义,因此在链接时,链接器将面临多个函数,所有函数都具有相同的名称,并正确地抱怨它不知道您打算使用哪个函数。
不要在头文件中定义函数。宣布他们是好的;定义他们,没有那么多。
发布于 2012-04-11 13:28:13
您可以在头文件和源文件中分离函数声明和定义。在您的示例中,您可以将tryMe()定义从"myclass.h“移动到"myclass.cpp",并且只在"myclass.h”中保留tryMe()的声明。其他方法是使用“内联”关键字,正如在其他答案中已经提到的那样。
https://stackoverflow.com/questions/10096968
复制相似问题