簡體   English   中英

將代碼分為.h和.cpp文件時的鏈接器錯誤

[英]Linker Error when separating code into .h and .cpp files

我有一個用於在C ++中打印出枚舉值的實現

如果我將所有代碼都放在.h文件中,則一切正常。 如果將函數實現分離為.cpp文件,則會收到鏈接器錯誤。

這是我的主文件

#include <iostream>
#include <vector>
#include "Day.h"
using namespace std;

int main(){
    initializeDayNames();
    Day a = Clubs;
    cout << a;
}

這是.h文件

#ifndef __Day__
#define __Day__

#include <iostream>
#include <vector>
#include <string>
using namespace std;

enum Day {Clubs, Hearts, Diamonds, Spades} ;

vector<string> DayNames = vector<string>();

ostream & operator<<(ostream & out, Day cs);

void initializeDayNames();

#endif

和.cpp文件

#include <iostream>
#include "Day.h"
#include<string>
#include<vector>
using namespace std;

void initializeDayNames(){
    DayNames.push_back("Clubs");
    DayNames.push_back("Hearts");
    DayNames.push_back("Diamonds");
    DayNames.push_back("Spades");
}


ostream & operator<<(ostream & out, Day cs){
    out << DayNames[cs];
    return out;
}

我在這里做錯了什么

具體錯誤是

Error   1   error LNK2005: "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > DayNames" (?DayNames@@3V?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@A) already defined in Day.obj main.obj

Error   2 fatal error LNK1169: one or more multiply defined symbols found   

您正在初始化的兩個副本

vector<string> DayNames = vector<string>();

因為您兩次包含了標題。

您應該將其替換為

extern vector<string> DayNames;

在h文件中

vector<string> DayNames = vector<string>();

在cpp文件中。

你似乎也有兩個副本

ostream & operator<<(ostream & out, Day cs);

標頭防護無法解決這種情況的原因是,當您包含標頭時,您基本上會在包含標頭的所有文件中重復定義。

在C語言中,聲明變量時,基本上是實例化它/為其分配靜態空間。 當您將變量聲明放在標頭中時,實際上是在為兩個不同的對象中的變量分配靜態存儲空間,這給您帶來了錯誤。

您在DayNames聲明中缺少extern

暫無
暫無

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

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