如果我在程序中包含头文件,则会出现以下问题。 (减少帖子的长度我删除了函数的实现)
我的文件如下:
// The main file: cturing.cpp
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include "rule.h"
#include "rekurzio.h"
int main(){
}
/////////////////////////////
// rule.h
#ifndef RULE_H
#define RULE_H
struct rule{
char kallapot,kjel;
char vallapot,vjel,velmozdulas;
};
rule getRuleFromString(std::string line){
}
bool addRule(rule szabaly, rule *szabalyok, int &ruleNo){
}
#endif
////////////////////////////
// rekurzio.h
#ifndef REKURZIO_H
#define REKURZIO_H
#include "rule.h"
void startRekurzio(rule*);
#endif
////////////////////////////
// rekurzio.cpp
#include <string>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include "rekurzio.h"
void getOptions(rule *options,rule *szabalyok, char allapot, char betu, int &j){
}
int getHely(int curr, char direction, std::string &comb){
}
bool realRekurzio(char &allapot, int hely, std::string combination, rule *szabalyok){
}
void nextCombination(std::string combination){
}
void startRekurzio(rule *szabalyok){
}
如果我尝试编译程序,我收到此错误:
$ g++ cturing.cpp rekurzio.cpp
/tmp/cchzIu1i.o: In function `getRuleFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
rekurzio.cpp:(.text+0x0): multiple definition of `getRuleFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/tmp/ccHXKygG.o:cturing.cpp:(.text+0x0): first defined here
/tmp/cchzIu1i.o: In function `addRule(rule, rule*, int&)':
rekurzio.cpp:(.text+0x118): multiple definition of `addRule(rule, rule*, int&)'
/tmp/ccHXKygG.o:cturing.cpp:(.text+0x118): first defined here
collect2: error: ld returned 1 exit status
当一切只定义一次时,什么可能导致多重定义错误?
我有更多文件,如果我包含它们......嗯,我有更多的错误信息。
另一方面,如果我不包含rekruzio.h文件(并删除来自此文件的函数调用),但仍然将rekurzio.cpp添加到编译器,它仍然存在这个问题。你可以看到每个头文件都有#ifndef / #define / #endif预处理器指令。
使用删除的rekurzio.h导入编译后,只有主文件(cturing.cpp)一切正常。