头文件里面的ifndef /define/endif的作用

c,c++里面,头文件里面的ifndef/define/endif的作用今天和宿舍同学讨论一个小程序,发现有点地方不大懂······是

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

c,c++里面,头文件里面的ifndef /define/endif的作用

今天和宿舍同学讨论一个小程序,发现有点地方不大懂······

     是关于头文件里面的一些地方:

例如:要编写头文件test.h

         在头文件开头写上两行:

          #ifndef _TEST_H

          #define _TEST_H//一般是文件名的大写

         ············

         ············

         头文件结尾写上一行:

          #endif

    大概是以前没有学好吧,对这里不是很理解,为什么要用这些呢?刚才上网查了查,借鉴了点高手的,自己总结了一点,就写在这里了,有什么错误之处,请大侠们指出

 

    1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

例如:

假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h。  
a.cpp的头部是:  
#include   “b.h ”  
#include   “c.h ”  
b.h和c.h的头部都是:  
#include   “d.h ”  
而d.h里面有class   D的定义。  
这样一来,  
编译器编译a.cpp的时候,先根据#include   “b.h “去编译b.h这个问题,再根据b.h里面的#include   “d.h “,去编译d.h的这个文件,这样就把d.h里面的class   D编译了;  
然后再根据a.cpp的第二句#include   “c.h “,去编译c.h,最终还是会找到的d.h里面的class   D,但是class   D之前已经编译过了,所以就会报重定义错误。 加上ifndef/define/endif,就可以防止这种重定义错误。

 

所以还是把头文件的内容都放在#ifndef和#endif中吧。  
不管你的头文件会不会被多个文件引用,你都要加上这个。  
一般格式是这样的:   
#ifndef   <标识 >   
#define   <标识 >   
……   
……   
#endif   <标识 >  
在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h   
#ifndef   _STDIO_H_   
#define   _STDIO_H_   
……   
#endif  

 
2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。   
#ifndef   AAA   
#define   AAA   
…   
int   i;   
…   
#endif   
里面有一个变量定义在vc中链接时就出现了i重复定义的错误,而在c中成功编译。   
原因:   
(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int   i   在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int   i   又被定义然后两个obj被另外一个.cpp也include   这个头的,连接在一起,就会出现重复定义.   (2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int   i,则自动认为其中一个是定义,其他的是声明。 

  
(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。  
(参考解决方法:   
(1).把源程序文件扩展名改成.c。   
(2).推荐解决方案:   .h中只声明   extern   int   i;  
        在.cpp中定义   
#ifndef   __X_H__   
#define   __X_H__   
extern   int   i;   
#endif   //__X_H__   int   i;   
注意问题:变量一般不要定义在.h文件中。

推荐:http://www.cnblogs.com/roucheng/p/cfenge.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120414.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm2021.3激活码破解方法

    pycharm2021.3激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
  • pageoffice生成离线license.lic

    pageoffice生成离线license.lic1、单位名称、联系人、联系电话按情况填写2、序列号:PageOfficeV4.0标准版试用序列号:IMTG6-BSXJ-JGZ6-3BIWMPageOfficeV4.0专业版试用序列号:C

    2022年7月3日
  • 电机的力矩计算

    电机的力矩计算1.转动惯量的公式1.1转矩如何计算转矩等于转动惯量乘以角加速度,然后我们要注意一下单位,转矩的单位是NM,转动惯量的单位是kg*m2,角加速度单位是rad/s2。M=I*BM是转矩,I是转动惯量,B是角加速度。1.2关于单位转矩=转动惯量*角加速度,转矩单位是N.m,转动惯量单位是Kg.m^2,那么角加速度单位是什么,如果是rad/s^2,怎么推算的?rad不是物理量单位,是角度单位,以rad做角度单位时,rad无需写明,除非强调时。即角速度单位就是s^-1,角加速度单

    2022年5月14日
  • Android 对apk进行重签名和查看签名(window 和mac)及生成签名

    Android 对apk进行重签名和查看签名(window 和mac)及生成签名标题实际上说了二个问题:查看签名和重签名先说一个简单的查看签名:第一步:将apk解压第二步:找到META-INF下的.RSA文件第三步:在mac终端或者window控制器上输入命令:keytool-printcert-filexxx.RSA回车,即可查看签名文件.将.RSA文件拖入到-file后面,即可查看:如下图重新签名…

    2022年4月28日
  • 计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!「建议收藏」

    计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!「建议收藏」各位学弟学妹们好,作为稍微年长的我(岁月是把杀猪刀啊),今天就给大家补补课。在大学里的,我们上的计算机专业课程一般都是像操作系统、编译原理、计算机组成原理、计算机网络这些理论课程,还有一些像C语言、Java、.Net这些可以实践的课程,甚至还有可能让你焊一个收音机,但是对于一些基本习惯却很容易被忽略,需要学弟学妹们自行摸索。实际上,一些好的基本习惯是时时刻刻在影响着我们自己的,不仅是在学校的学习生活中,还是在毕业后的工作生活中。今天我要给大家说就是,使用键盘的习惯。有的同学可能会诧异,键盘谁不会用啊,

    2022年7月16日
  • 2019的10个最佳WordPress画廊插件

    2019的10个最佳WordPress画廊插件在视觉文化时代,如果您的网站包含图片,则它会获得更多的观看次数。研究表明,如果带有照片或视频,您的内容将获得更好的好评。这很有意义,因为大多数人都以视觉为导向,而我们的大脑在视觉上比在文本中更快地处理和理解事物。不仅如此,大多数人都可以在带有图像的情况下更好地处理和理解文本。这就是为什么显示网站上的照片或视频会使内容的参与度提高70%以上的原因。这也是同样的原因,如果您包含图…

    2022年6月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号