【发布时间】:2010-07-16 21:34:13
【问题描述】:
我有一个用 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
【问题讨论】:
-
你只是从不同的枚举示例中挑选部分吗?我想查看以不同卡片套装命名的每周 4 天的日历。
-
创建一个原型代码生成器,里面有很多硬编码的东西
-
请不要在头文件中使用
using namespace std;行,而是使用std::限定符(请参阅本文中的第一个答案:stackoverflow.com/questions/1265039/using-std-namespace) -
更喜欢使用不带下划线的包含守卫和标识符。前导下划线保留用于编译器和实现。您的标识符和包含保护可能与当前或未来版本的编译器冲突。
-
另请注意:使用 Day 是个坏主意。所有包含双下划线的标识符都由编译器或操作系统保留,您可能会与stackoverflow.com/questions/228783/… 发生冲突
标签: c++ linker-errors