C在编译的时候显示函数命名重复

发布于 2022-09-06 09:52:50 字数 2953 浏览 16 评论 0

我在用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许你一世情深 2022-09-13 09:52:51

一般情况下不要#include.c文件!!!
在编译的时候,首先工作的是预处理器,预处理器将#include展开成对应文件的内容,这里你的SeqList.c文件里的函数定义就会被放进main.c中。
接着编译器会实际编译被预处理器处理过的main.cSeqList.c,然后就得到了两份SeqList.c中的函数定义对应的汇编/机器码。
接着会链接,有两组名字一样的函数定义,自然就链接不上了……
解决方案就是另外做一个SeqList.h放函数的声明,然后#include .h文件
Linux不会报错大概是编译器的容错机制做的好吧……

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文