首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数在标头中定义并从cpp文件错误中调用。

函数在标头中定义并从cpp文件错误中调用。
EN

Stack Overflow用户
提问于 2012-04-10 21:50:40
回答 3查看 169关注 0票数 1

我有两个简单的文件,它们定义了一个带有C++函数的tryME类

代码语言:javascript
复制
______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()之前?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-10 21:53:11

这是:

代码语言:javascript
复制
inline void tryME()
{

}

否则,您将违反one定义规则

在头文件中定义非inline方法将导致包含该标头的所有翻译单元导出该方法,因此出错。

票数 1
EN

Stack Overflow用户

发布于 2012-04-10 21:55:04

它确实是可见的。它在加载头文件的每个文件中都是一个单独的定义,因此在链接时,链接器将面临多个函数,所有函数都具有相同的名称,并正确地抱怨它不知道您打算使用哪个函数。

不要在头文件中定义函数。宣布他们是好的;定义他们,没有那么多。

票数 1
EN

Stack Overflow用户

发布于 2012-04-11 13:28:13

您可以在头文件和源文件中分离函数声明和定义。在您的示例中,您可以将tryMe()定义从"myclass.h“移动到"myclass.cpp",并且只在"myclass.h”中保留tryMe()的声明。其他方法是使用“内联”关键字,正如在其他答案中已经提到的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10096968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档