ifndef与define与endif作用和用法.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《ifndef与define与endif作用和用法.doc》由会员分享,可在线阅读,更多相关《ifndef与define与endif作用和用法.doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ifndef/define/endif作用和用法1.问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它高手请指点一下谢谢!用法:.h文件,如下:#ifndef XX_H#define XX_H#endif这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 。因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了#ifndef GRAPHICS_H / 防止graphics.h被重复引用#define GRAPHICS_H#include / 引用标准库的头文件#include “my
2、header.h” / 引用非标准库的头文件void Function1(); / 全局函数声明class Box / 类结构声明#endif那是指你建立多个文件时,多个文件里都包含这个头文件给你举个例子,再顺便分析一下:假设你的工程里面有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.
3、h的这个文件,这样就把d.h里面的class D编译了;然后再根据a.cpp的第二句#include c.h ,去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。加上ifndef/define/endif,就可以防止这种重定义错误。A.h 里#ifndef A_H#define A_H#endifB.h 和 C.h都include A.h D.h里include B.h include C.h 在预编译的过程中,执行到include C.h 时会因为在上一句的时候已经定义了A_H这个宏,所以此时的的的ifndef条件不满足,也就
4、不会再一次包含A.h,起到了防止重复引用头文件的效果。1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:#ifndef #define #endif 在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h#ifndef _STDIO_H_#define
5、 _STDIO_H_#endif2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。#ifndef AAA#define AAAint i;#endif里面有一个变量定义在vc中链接时就出现了i重复定义的错误,而在c中成功编译。原因:(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次单独生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义. (2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C+。在
6、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文件中。#if,#ifdef,#ifndef的区别一般情况下,源程序中所有的行都参加编译
7、。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:#ifdef 标识符程序段1#else程序段2#endif它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有,即:#ifdef程序段1#denif这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ifndef define endif 作用 用法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内