我有3个项目:服务器 ,客户下议院 。制作标题和源对下议院 不会引起任何问题,我可以从两者中自由访问功能服务器客户

但是,由于某些原因,在内部制作其他源/标头文件服务器 或者客户 项目总是导致multiple definition of (...)first defined here错误。

例子:

commands.h (在root dir中客户项目)

#ifndef COMMANDS_H_
#define COMMANDS_H_

#include "commands.c"

void f123();

#endif /* COMMANDS_H_ */

commands.c (在root dir中客户项目)

void f123(){

}

main.c (在root dir中客户项目)

#include "commands.h"
int main(int argc, char** argv){

}

错误:

make: *** [Client] Error 1      Client
first defined here              Client
multiple definition of `f123'   commands.c

清洁,重建指数,重建项目无济于事。重新启动计算机。

答案

这里的问题是您包括commands.ccommands.h函数原型之前。因此,C前处理器插入了commands.c进入commands.h函数原型之前。commands.c包含功能定义。结果,函数定义在引起错误的函数声明之前结束。

内容的内容commands.h在处理前阶段之后,如下所示:

#ifndef COMMANDS_H_
#define COMMANDS_H_

// function definition
void f123(){

}

// function declaration
void f123();

#endif /* COMMANDS_H_ */

这是一个错误#include "commands.c"函数声明不应发生错误,因为现在,函数原型是在函数声明之前出现的。

但是,包括一个.c文件是bad practice 并应避免。解决此问题的更好解决方案是包括commands.hcommands.c并将命令的编译版本链接到主文件。

commands.h

#ifndef COMMANDS_H_
#define COMMANDS_H_

void f123(); // function declaration

#endif

commands.c

#include "commands.h"

void f123(){} // function definition

来自: stackoverflow.com