为什么我在声明 ifstream 时收到"Already defined"错误?
Why am I getting an "Already defined" error when I declare an ifstream?
我是使用头文件等的新手,上学期我们在一个巨大的(可怕的:p)文件中做了所有事情......
我在做不该做的事情吗?尝试运行该程序会导致以下结果:
1> LINK : ~~~CSC 161Accounting AssignmentDebugAccounting 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 161Accounting AssignmentDebugAccounting Assignment.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
统计.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
统计.cpp:
#include "statistics.h"
...working functions...
void welcome()
{
system("CLS");
welcomeFile.open("about.txt");
printFile(welcomeFile);
welcomeFile.close();
pause();
}
错误看起来像是试图定义两次,但我认为 #ifndef 应该设置它,所以它只定义了一些东西,如果它们还没有定义的话?这是我宣布欢迎文件的唯一地方...
因为您在头文件中定义了对象并违反了一个定义规则。
永远不要在头文件中定义对象!
标头保护可防止标头的内容在预处理期间多次包含在同一个翻译单元中。它们不会阻止内容包含在不同的翻译单元中。当您将此头文件包含在不同的翻译单元中时,每个单元都将具有此对象的定义。
编译器分别编译每个翻译单元以生成单独的对象文件 (.o),每个 .o 文件都将具有此对象定义的副本。当链接器在生成.exe
时尝试链接到对象/符号名称时,它会找到同一对象/符号的多个定义,从而导致要链接到哪个定义的混淆。为了避免这个问题,标准定义了一个称为一个定义规则(ODR)的规则,该规则禁止对同一实体进行多个定义。
如您所见,在头文件中包括对象定义并将该头文件包含在多个翻译单元中违反了 ODR。
如果要使用全局对象,则需要将其声明为 extern
并在一个且仅一个源文件中定义它。
好读:
错误LNK2005,已经定义?
您应该将该定义放在.cpp文件中。否则,包含此 .h 文件的每个文件都将具有此变量的定义,最终在链接过程中发生冲突。
附言将using namespace std;
放在标题中被认为是不好的。
相关文章:
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 使用 gtest 时"_main already defined"
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 是什么导致了代码中出现"error LNK2005: already defined in .obj"错误?
- 在VS 2015中使用Microchip的mpusbapi.h会产生"LNK2005 Already defined"错误
- "Destructor already defined"专用析构函数
- 由 Boost 单元测试框架 dll 导出的 std::basic_ostringstream 会导致"already defined symbol"错误
- 为什么"already defined"?
- 导致链接器错误的单一实例:"already defined"
- 避免 c++ none 类变量中的"already defined in ..."错误/交战
- 全局指针"already defined in"错误
- 编译错误"already defined"
- 如何在此处收到"already defined"链接器错误?
- 错误 LNK2005:"already defined in SkinHeaderCtrl.obj"
- C++ 可变参数模板"multiple definitions"/"already defined"问题
- 无法通过"DllMain already defined"错误
- LNK2005 (already defined)
- miniz.c 在 VS 中出现"already defined"错误
- C++03 链接器"already defined symbol"未显示在中间文件中
- LNK2005 .obj 中的函数指针数组"already defined"