[英]Function defined in the header and called from the cpp file error
我有這兩個簡單的文件,它們定義了一個 C++ class 和一個 tryME function
______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:錯誤 LNK2005:“void __cdecl TryME(void)”(?TryME@@YAXXZ) 已在 tryout.obj 中定義 1>C:\tryout.exe:致命錯誤 LNK1169:找到一個或多個多次定義的符號
如果我將 tryME() function 聲明為 static,問題就解決了。 但為什么?
我知道 .h 文件包含在 .cpp 文件中然后編譯(進入翻譯單元)並且 static 變量和函數對它們包含的整個翻譯單元可見,但為什么程序不起作用沒有“靜態”關鍵字? function tryME 應該在 class 之外是“全局的”,因此可見,不是嗎? 調用是否在 tryME() 之前放置了“this->”?
這個:
inline void tryME()
{
}
否則,您將違反單一定義規則。
在 header 文件中定義非inline
方法將導致它被包含該 header 的所有翻譯單元導出,因此產生錯誤。
它確實是可見的。 它在加載 header 文件的每個文件中作為單獨的定義可見,因此在鏈接時 linker 面臨多個同名函數,並正確地抱怨它不知道您打算使用哪個。
不要在 header 文件中定義函數。 聲明它們是好的; 定義它們,而不是那么多。
您可以在header文件和源文件中將function聲明和定義分開。 在您的情況下,您可以將 tryMe() 定義從“myclass.h”移動到“myclass.cpp”,並僅在“myclass.h”中保留 tryMe() 的聲明。 其他方法是使用“內聯”關鍵字,正如其他答案中已經提到的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.