回 帖 发 新 帖 刷新版面

主题:[讨论]C预编译的重复定义问题,新手求指导

我想实现程序分类定义,一个C文件全部用来定义数据类型,一个用来定义函数,一个主程序:
三个文件预编译头如下:
"Data_Define.c"
#ifndef DATA_DEFINE_H
#define DATA_DEFINE_H
    int i,j;
    int Data_Int,Data_Address;
    char Data_Char;
    float Data_Float;
    char *Data_String;
               .......

#endif
------------------------
"F_Define.c"
#ifndef F_DEFINE_H
#define F_DEFINE_H

#include "Data_Define.c"
#include "stdio.h"
int F_Data_Deal()
{    
    printf("数据的处理示例函数\n");
              .......
#endif
----------------------------------
"Test_Main.c"
#include<stdio.h>
#include"Data_Define.c"
#include"F_Define.c"
    
int main()
{
.......

三个文件编译都没问题,链接运行的时候出错:
Test_Main.obj : error LNK2005: _F_Data_Deal 已经在 F_Define.obj 中定义
什么原因呢?[em10][em10]

回复列表 (共4个回复)

沙发

兄弟,一看你的代码,我就头大——希望,我这句话,不要给你带来任何的烦恼。

没事,刚开始,写出问题多多的代码,是很正常的事情。

你是不是,把写在一个文件里面的代码,拆分成3个文件,然后要实验一下多文件编译?

得学会把编译器当老师——它可是最不厌其烦的人——你不断地用问题代码,向它请教,
对不对,它一点也不厌烦,很有耐心。也非常严禁,只要有一点错误,它就给你指出来。

所以,你得明白,这位老师,对你作业的评语,到底是什么意思。

Test_Main.obj : error LNK2005: _F_Data_Deal 已经在 F_Define.obj 中定义

它是说,它在链接三个文件的时候,发现 _F_Data_Deal 在 F_Define.obj (由
"F_Define.c" 和"Data_Define.c" 两个文件编译得来——注意,你的#include "" 语句!
)有了一次定义;在你的Test_Main.obj(由"Test_Main.c","F_Define.c" 和
"Data_Define.c" 三个文件编译得来——注意,你的#include "" 语句!)中,又发现了
一次定义。

所以,连接器就疑惑了,它不知到 名字叫_F_Data_Deal 的这个东西,应该以哪个为准?

希望楼主,能自己找到解决问题的办法。

给一点提示,利用好搜索引擎这个工具;以及,C语言中的内部链接、外部链接方面的知识


当然,为了防止程序员不小心犯你这种错误,所以,在编写代码的时候,还有一些准则的
东西。——这个你就不用急了,代码写多了,你自己都知道了,不用别人教你,只要,你
会思考?我想,敢在论坛上发帖,不怕嘲笑的你,应该有自己思考,和解决问题的勇气吧

板凳

问题解决了我在F_Define.c中加了static,
或者在Tset_Main.c中,去掉#include<F_Define.c>,声明extern函数F_Define


不过我还是不太懂设static,和设extern是函数具体差别。两种方式函数的活动方式一样吗,哪个效率更高?

3 楼

效率无差别,Include版本会导致编译后可执行文件变大。

4 楼

LZ对#ifndef DEFINE_H
    #define DEFINE_H
理解有误!对链接理解有误,如果用gcc之类的话,就不会出现把前面两部分定义成.c了!而你用IDE的话,会自动把.c转成.obj的!
  这些问题我刚学时也遇到过!现在发现很多问题,都是太依靠环境了,导致很多基础性东西不懂,比如点一下开发环境的run,就会自动去编译,链接了。对于初学者而言,屏蔽了很多东西,也导致对一些关键字理解有误,也不知道大学教育为何要把时间都花在语言的语法上,这些应该让学生自已课前预习的。而开发环境应该用类似gcc命令之类,makefile之类的学习,变量分配到哪了?最好讲一下exe(PE结构学习)是如何运行的,内存的分配等问题。当然这些需要汇编和操作系统的知识!
   推荐一本书《程序员的自我修养》,只要有这些想法,基本能把握大的方向,知道问题在哪了,找问题就容易了!
   我正在努力中,一起加油学习

我来回复

您尚未登录,请登录后再回复。点此登录或注册