簡體   English   中英

Function 在header中定義並從cpp文件中調用出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM