搜索
bottom↓
回复: 16

我用了#ifndef...#define...#endif结构为什么无法避免重复包含?

[复制链接]

出0入0汤圆

发表于 2008-3-31 21:25:11 | 显示全部楼层 |阅读模式
最近编写一个程序中,我用了#ifndef...#define...#endif结构为什么无法避免重复包含?
整个程序中将各种外部芯片各自形成一个头文件和一个C文件,其中一个文件是PCF8563.H,在这个文件里面已经加入了避免重复包含的宏定义,并且在头文件中定义了一些变量和一些函数说明。在相应的PCF8563.C里面包含了这个头文件和主文件里面(文件名是MAIN.C)也包含了这个头文件,这时候没问题,但有另外一个文件里面ADS1110.H里面也要用到PCF8563.H这个头文件,一旦包含了这个文件就出错!不知道为什么!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-3-31 21:58:40 | 显示全部楼层
注意声明和定义,如果变量是私有的就在.c中声明和定义。

出0入0汤圆

 楼主| 发表于 2008-4-1 21:23:18 | 显示全部楼层
应该不是这个原因,因为在头文件里面有不少的变量定义,但只有前面的一个变量出现问题,一旦把那个变量注释掉就好了(不过会出现变量未定义的错误)

出0入0汤圆

发表于 2008-4-1 21:47:25 | 显示全部楼层
变量定义不能或者说不应该定义在.h文件中,例如 有 a.h,里面定义了变量 int temp; 如下:
// a.h
#ifndef _a_h_
#define _a_h_
int temp; // define varible
#endif

// 工程包含两个模块 a.c ,b.c

//--------b.c----------
#include"a.h"
...
//显然编译器编译b.c的时候符号_a_h_没有定义,则temp 变量在b.c里定义了一次


// -------a.c ----------
#include "a.h"
//编译器是独立编译b.c和a.c的,甚至编译顺序都是不确定的,所以编译器编译每个.c文件的时候符号定义都是独立的,
//这时候,仍然 没有定义 _a_h_ 这个符号,则文件a.h再次被a.c包含, temp变量再次定义,但编译仍然没有问题.


// 下面链接器link开始工作,链接b.obj和a.obj,结果有两个temp变量 ,link error!


不知道楼主的问题是不是这个原因?


另外:
#ifndef  #define ,else ,... #endif 结构是用来避免以下情况的重复包含的,而不是为上面所说情况准备的

--------------------------------------------------------------
//--- a.h
#ifndef _a_h
#define _a_h
declaration in a
#endif
// end of a.h

------------------------------------------------------------------

//---- b.h
#ifndef _b_h
#define _b_h

#include "a.h" // 注意这里
declaration in b

#endif
// end of b.h
---------------------------------------------------------

//---a.c
#include "a.h"
#include "b.h"
// end of a.c
展开为以下内容:
------------------------------------------------------------

#ifndef _a_h
#define _a_h
declaration in a   //定义了  符号 _a_h
#endif

#ifndef _b_h
#define _b_h


#ifndef _a_h       // 已经定义了 _a_h
#define _a_h
declaration in a   // 这行才是重复的,失去作用了
#endif

declaration in b   // b.h中的声明

#endif

出0入0汤圆

发表于 2009-10-13 23:59:31 | 显示全部楼层
刚拜读过“shark”帖子,受益,谢谢!

出0入0汤圆

发表于 2011-4-8 15:56:27 | 显示全部楼层
shark讲得不错
#ifndef  #define ,else ,... #endif 只能解决单个c文件重复包含一个h文件的问题
如果在h文件定义了变量,即使在h文件中加上了#ifndef  #define ,else ,... #endif ,当此h文件被多个c文件包含还是会出现重复定义的错误,#ifndef  #define ,else ,... #endif 不是解决这种问题的

所以把变量和函数的定义都写在c文件中,h文件中仅仅作变量和函数的声明,h文件中再加上#ifndef  #define ,else ,... #endif ,即不会出现重定义的问题了。。。

出50入0汤圆

发表于 2011-4-8 16:25:12 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-8 16:50:25 | 显示全部楼层
重新认识了防重新包含,顶。

出0入0汤圆

发表于 2011-8-22 10:10:33 | 显示全部楼层
shark

出0入0汤圆

发表于 2011-8-22 15:35:23 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2013-6-17 09:51:09 | 显示全部楼层
mark,学习了

出0入0汤圆

发表于 2013-6-18 12:30:59 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-6-18 12:50:49 | 显示全部楼层
Mark ,学习了

出0入0汤圆

发表于 2013-6-18 20:22:53 来自手机 | 显示全部楼层
是不是把函数定义到头文件里面了??

出0入296汤圆

发表于 2013-6-19 10:28:48 | 显示全部楼层
为shark的讲解配幅图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-6-19 10:36:19 | 显示全部楼层
傻孩子,把你书里面讲解这个内容的页面截过来吧

出0入0汤圆

发表于 2013-6-19 10:38:14 | 显示全部楼层
不过ICC好像能自动解决重复包含的问题
编译能通过,但是有warning会指出这些问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表