重新定义函数,同时将文件包含在C++中(错误 LNK2005)
Re-definitions of functions while including files in C++ (error LNK2005)
我是C++新手,我有一个基本的疑问。
我正在创建一个法语动词共轭应用程序。
我有两个文件,一个共轭.cpp文件和一个 ErVerbs.cpp 文件。我想将大部分函数保留在 ErVerbs 源文件中并使用共轭器文件以使用这些函数。
以下是一些代码片段:
共轭.cpp
#include <iostream>
#include <string>
#include "Variables.h"
#include "ErVerbs.cpp"
#include "IrVerbs.cpp"
#include "ReVerbs.cpp"
using namespace std;
void check()
{
if (verb.substr(len - 2, len) == "er")
erVerbs();
else if (verb.substr(len - 2, len) == "ir")
irVerbs();
else if (verb.substr(len - 2, len) == "re")
reVerbs();
}
int main()
{
cout << "Enter verb : ";
getline(cin, verb);
cout << "Enter tense : ";
getline(cin, tense);
len = verb.length();
check();
}
动词.cpp
#include <iostream>
#include <string>
using namespace std;
void erVerbs()
{
cout << "er Verb"; cin.get();
}
同样,我还有其他三个具有类似功能的此类.cpp源文件。
当我构建程序时,我收到一个错误,指出我正在使用的每个方法都已定义已经。
1>ErVerbs.obj : error LNK2005: "void __cdecl erVerbs(void)" (?erVerbs@@YAXXZ) already defined in Conjugator.obj
1>ErVerbs.obj : error LNK2005: "void __cdecl erVerbs(void)" (?erVerbs@@$$FYAXXZ) already defined in Conjugator.obj
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" (?irVerbs@@YAXXZ) already defined in Conjugator.obj
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" (?irVerbs@@$$FYAXXZ) already defined in Conjugator.obj
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" (?reVerbs@@YAXXZ) already defined in Conjugator.obj
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" (?reVerbs@@$$FYAXXZ) already defined in Conjugator.obj
如果有人能告诉我如何将函数保存在单独的源文件中并将它们 #include 在一个源文件中并使用它们的函数而不会重新定义错误,我将不胜感激。
不要:
#include "ErVerbs.cpp"
在共轭器.cpp中,这就是导致链接器错误的原因。通过像这样包含您的 cpp 文件,您可以再次重新定义此函数。
您应该创建 ErVerbs.h 文件并为您的函数添加声明:
#if !defined(ER_VERBS_H)
#define(ER_VERBS_H)
void erVerbs();
#endif
在 Conjugator.cpp 中,包含 #include"ErVerbs.h",其他函数也是如此。
永远不要包含 *.cpp 文件。删除以下内容
#include "ErVerbs.cpp"
#include "IrVerbs.cpp"
#include "ReVerbs.cpp"
创建包含以下内容的 erVerbs.h:
void erVerbs();
并将其包含在共轭器中.cpp
#include "ErVerbs.h"
当你包含模块时
#include "ErVerbs.cpp"
#include "IrVerbs.cpp"
#include "ReVerbs.cpp"
在模块 Conjugator 中.cpp然后所有四个模块都包含函数的定义,编译器对此进行了说明。
您必须在某个头文件中声明函数,并将其包含在使用这些函数的所有模块中,同时将其定义保存在一个模块(或多个模块之间)中,而不会包含在任何其他模块中。
您正在从另一个.cpp file
#including
.cpp
文件,因此函数定义将存在于两个位置。
您可能想要做的是创建一个Conjugator.h
头文件,声明(但不定义)函数,并包含它。
如果您不知道如何防止.h
文件中的多个声明,还可以在使用它时查找标头保护(或#pragma once
)。
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 禁止显示有关包含文件中 #pragma 包的警告
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 使用开发工具包将文件上传到 AWS C++
- TCP-Server以数据包结构(非Java客户端)发送文件
- 致命错误 C1083:无法打开包含文件:'atlbase.h' Pyinsane 包
- 可视化 将 TCP 服务器数据包保存到 C++ 中的文件
- Buildroot 包需要一个带有C++大文件错误的工具链
- 获取包含C++的捆绑包中文件的路径(CFBundleGetMainBundle)
- 数据包大小(每数据包 mBytes)或核心音频中 AAC 文件的比特率
- CMake 包配置文件中的泛型"transitive behavior" (find_dependency)
- Visual Studio 14.0 和 Windows 工具包中的错误包括文件夹
- 获取 PCAP 文件中数据包的 IP 地址
- 如何在 C++ 中读取 PCAP 文件以获取数据包信息
- 如何在C++中分析来自流量转储文件的数据包信息
- 拆包/解密/提取/application.bin文件
- Python:将二进制文件读取到一个结构中,然后拆包
- 如何在visual studio 2010 C++中制作带有所需.dll和lib(opencv)文件的.exe文件包