簡體   English   中英

當我聲明ifstream時,為什么會出現“已經定義”的錯誤?

[英]Why am I getting an “Already defined” error when I declare an ifstream?

我是新手使用頭文件等,上學期我們在一個巨大的(可怕的:p)文件中做了所有事情......

我在做一些我不應該做的事嗎? 嘗試運行該程序會導致以下結果:

1>  LINK : ~~~\CSC 161\Accounting Assignment\Debug\Accounting Assignment.exe not found or not built by the last incremental link; performing full link
1>driver.obj : error LNK2005: "class std::basic_ifstream<char,struct std::char_traits<char> > welcomeFile" (?welcomeFile@@3V?$basic_ifstream@DU?$char_traits@D@std@@@std@@A) already defined in statistics.obj
1>~~~~\CSC 161\Accounting Assignment\Debug\Accounting Assignment.exe : fatal error LNK1169: one or more multiply defined symbols found
1>

statistics.h:

#ifndef _STATISTICS_INTERFACE_
#define _STATISTICS_INTERFACE_
...
#include<fstream>

using namespace std;
ifstream  welcomeFile;   //if I comment this out, it compiles

class Stats
{
...blah...
};

void welcome();
void pause();
void printFile(ifstream &inFile);

#endif

statistics.cpp:

#include "statistics.h"

...working functions...

void welcome()
{
    system("CLS");
    welcomeFile.open("about.txt");
    printFile(welcomeFile);
    welcomeFile.close();
    pause();
}

錯誤看起來像是試圖定義兩次,但我認為#ifndef應該設置它所以它只定義了它們尚未定義的東西? 這是我宣布welcomeFile的唯一地方......

因為您在頭文件中定義了對象並違反了一個定義規則

永遠不要在頭文件中定義對象!

在預處理期間,標題保護可防止標題的內容在同一 翻譯單元中多次包含。 它們不會阻止內容包含在不同的翻譯單元中。 當您將此頭文件包含在不同的轉換單元中時,每個單元都將具有此對象的定義。
編譯器分別編譯每個轉換單元以生成單獨的目標文件( .o ),每個.o文件都將具有此對象定義的副本。 當鏈接器在生成.exe時嘗試鏈接到對象/符號名稱時,它會找到同一對象/符號的多個定義,從而導致混淆哪個鏈接到哪個。 為了避免這個問題,該標准定義了一個稱為一個定義規則(ODR)的規則 ,該規則禁止同一個實體的多個定義。
如您所見,在頭文件中包含對象定義,並且在多個翻譯單元中包含該頭文件會違反ODR。

如果要使用全局對象,則需要將其聲明為extern並將其定義在一個且只有一個源文件中。

好讀:
錯誤LNK2005,已定義?

您應該將該定義放在.cpp文件中。 否則,包含此.h文件的每個文件都將具有此變量的定義,該變量在鏈接期間最終會發生沖突。

ps put using namespace std; 在你的標題中, 被認為是壞的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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