我有一个main.cpp
文件,其中包含以下内容:
#include<iostream>
using namespace std;
#include"Command.cpp"
#define EXIT 5
int main(){
int code;
do{
code = getCommand();
doCommand(code);
}while(code != EXIT);
}
在我的Command.cpp
文件中,我有一些功能:
#include<iostream>
using namespace std;
#include"Service.h"
Service * first = new Service();
int getCommand(){
cout<<"Choose one of the following commands: "<<endl;
cout<<"1. Add new service"<<endl;
cout<<"2. Add new subservice"<<endl;
cout<<"3. Add parent to a service"<<endl;
cout<<"4. Delete a service(and it's subservices)"<<endl;
cout<<"Your Choice: ";
int c;
cin>>c;
return c;
}
void addService(){
first->add();
}
void addSubService(){
cout<<"Let's choose the parent first: "<<endl;
int * one = new int;
*one = 1;
first->print(one,0);
cout<<"0. here."<<endl<<"> ";
int id;
cin>>id;
Service * f = first->find(one,id);
}
void addParentToService(){
}
void doCommand(int c){
switch(c){
case 1:
addService();
break;
case 2:
addSubService();
break;
case 3:
addParentToService();
break;
case 4:
//deleteService();
break;
}
}
但是当我点击Visual Studio中的编译按钮时,我收到以下错误:
1>Command.obj : error LNK2005: "void __cdecl addParentToService(void)" (?addParentToService@@YAXXZ) already defined in Source.obj
1>Command.obj : error LNK2005: "void __cdecl addService(void)" (?addService@@YAXXZ) already defined in Source.obj
1>Command.obj : error LNK2005: "void __cdecl addSubService(void)" (?addSubService@@YAXXZ) already defined in Source.obj
...
我认为问题在于链接这些文件,但我不知道该怎么办......
答案 0 :(得分:1)
您永远不应该将cpp文件包含在其他cpp文件中。这是使用.h文件的地方。你可以参考这个关于如何做到这一点的问题:
Using multiple .cpp files in c++ program?
基本上,您遇到的问题是您多次包含Command.cpp文件。预处理器获取文件的内容,并直接将其复制到包含在其中的文件中,这意味着如果不保护文件不被重新包含,您最终可能会对同一对象有多个定义。 (这也是警卫发挥作用的地方)。
这是一个要涵盖的整体大型主题,有很多资源可以讨论这个问题。
答案 1 :(得分:0)
如果要将功能链接到不同的文件,则永远不会在另一个.cpp
文件中包含.cpp
个文件。您只需包含.hh
个文件,您可以在其中定义任何其他函数,这些函数在其他.cpp
文件中实现。
示例:main.cpp
#include "42.hh"
#include <iostream>
int main() {
func42();
return 0;
}
包含文件:42.hh
#ifndef _42_HH_
#define _42_HH_
void func42();
#endif
功能文件:42.cpp
#include <iostream>
void func42() {
std::cout << "Fourty-two" << std::endl;
}
编译并运行:
~$ g++ 42.cpp main.cpp -o fourty-two
~$ ./fourty-two
Fourty-two