C在编译的时候显示函数命名重复
我在用c写程序,标准是C99,编译器是gcc。用的是windows下的Clion
我有三个文件:main.c SeqList.c define.h
在程序中我会定义结构体并且定义的结构体可能出现在任意一个源文件中,所以我的想法是在define.c中定义,然后供各个源文件使用。下面的代码是define.c中的全部代码
#ifndef DATA_STRUCTURE_DEFINE_H
#define DATA_STRUCTURE_DEFINE_H
#define MAX 100
//线性表的顺序存储结构
typedef struct
{
//指向第一个节点的指针
int *firstNode;
//表当前的长度
int length;
//表最大的长度
int size;
}SeqList, *PSeqList;
#endif //DATA_STRUCTURE_DEFINE_H
我想在SeqList.c中使用define.c,下面是我的SeqList.c的代码
#include "define.h"
#include <stdio.h>
#include <stdlib.h>
/**
* 初始化
* @param p
* @return
*/
int initial(PSeqList p)
{
p->length = 0;
p->size = MAX;
p->firstNode = (int *)malloc(sizeof(int)*(p->size));
}
/**
* 创建
* @param p
* @return
*/
int create(PSeqList p)
{
int i, length;
int *index = p->firstNode;
if(p->firstNode == NULL){
printf("Invalid list\n");
exit(-1);
}
printf("Input the length of the node\n");
scanf("%d", &length);
for(i = 0; i < length; i++){
printf("Input the node value\n");
scanf("%d", index++);
}
}
下面的是main.c的代码
#include <stdio.h>
#include "SeqList.c"
int main()
{
SeqList seqList;
initial(&seqList);
create(&seqList);
}
然后我点了Clion中的运行按钮,如下图
但是报错了,如下
C:Program FilesJetBrainsCLion 2017.3bincmakebincmake.exe" --build D:phpStudyWWWdata-structurecmake-build-debug --target data_structure -- -j 2
Scanning dependencies of target data_structure
[ 33%] Building C object CMakeFiles/data_structure.dir/main.c.obj
[ 66%] Building C object CMakeFiles/data_structure.dir/SeqList.c.obj
[100%] Linking C executable data_structure.exe
CMakeFilesdata_structure.dir/objects.a(SeqList.c.obj): In function `initial':
D:/phpStudy/WWW/data-structure/SeqList.c:11: multiple definition of `initial'
CMakeFilesdata_structure.dir/objects.a(main.c.obj):D:/phpStudy/WWW/data-structure/SeqList.c:11: first defined here
CMakeFilesdata_structure.dir/objects.a(SeqList.c.obj): In function `create':
D:/phpStudy/WWW/data-structure/SeqList.c:23: multiple definition of `create'
CMakeFilesdata_structure.dir/objects.a(main.c.obj):D:/phpStudy/WWW/data-structure/SeqList.c:23: first defined here
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: * [CMakeFilesdata_structure.dirbuild.make:122: data_structure.exe] Error 1
mingw32-make.exe[2]: * [CMakeFilesMakefile2:67: CMakeFiles/data_structure.dir/all] Error 2
mingw32-make.exe[1]: * [CMakeFilesMakefile2:79: CMakeFiles/data_structure.dir/rule] Error 2
mingw32-make.exe: * [Makefile:117: data_structure] Error 2
不知道是哪里做的不对,求大神指教。PS:我在Linux的虚拟机下执行没有任何问题
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一般情况下不要
#include
.c文件!!!在编译的时候,首先工作的是预处理器,预处理器将
#include
展开成对应文件的内容,这里你的SeqList.c
文件里的函数定义就会被放进main.c
中。接着编译器会实际编译被预处理器处理过的
main.c
和SeqList.c
,然后就得到了两份SeqList.c
中的函数定义对应的汇编/机器码。接着会链接,有两组名字一样的函数定义,自然就链接不上了……
解决方案就是另外做一个
SeqList.h
放函数的声明,然后#include
.h文件Linux不会报错大概是编译器的容错机制做的好吧……