




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C+指令 #undef ,#ifdef, #ifndef,#if的用法#ifdef,#ifndef使用条件编译命令最常见的形式为:#ifdef 标识符程序段1#else程序段2#endif它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有,即:#ifdef程序段1#denif这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。例如,当程式跑到else,如果TRACE没被定义,则下一句再定义源代码:#define TRACE(x)#if DBG#undef TRACE#define TRACE(x) g_TraceCallback x#else#ifndef TRACE#define TRACE(x)#endif#endif解析:#define TRACE(x)#if DBG#undef TRACE#define TRACE(x) g_TraceCallback x#else#ifndef TRACE /如果之前没定义,则跑下边定义-该例前边有#define TRACE(x) ,则后边的定义自动失效因此不会因为重复定义而出错#define TRACE(x) /定义#endif#endif我们有时也采用下面的形式:#ifndef 标识符程序段1#else程序段2#endif只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。以上两种形式用法差不多,根据需要任选一种,视方便而定。还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符:#if 表达式程序段1#else程序段2#endif当表达式成立,则跑程序段1,否则跑程序段2注意:除#undef释放之前的宏定义可单独使用之外,#ifdef,#if,#ifndef均要与#endif配对如:#if.#else.#endif#ifdef.#endif#ifndef.#endif以下转自:/bigpretty/article/details/5018261一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:/#ifdef 标识符程序段1#else程序段2#endif它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有,即:#ifdef程序段1#denif在头文件中使用#ifdef和ifndef是非常重要的,可以防止双重定义的错误。如你在头文件aaa.h中定义了一个类aaa如下: class aaa ; 如果两次include aaa.h(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改: #ifndef _aaa_ #define _aaa_ class aaa ; #endif 就可以避免这样的问题。因为当你已经包含过这个文件,_aaa_就会有了定义,那么#ifndef的条件为假,就不会再执行后面的类定义了。#ifdef和#endif必须成对使用。 从理论上讲可以出现在任何地方(头文件和实现文件中) 通常为了防止头文件被多次包含,在头文件中使用是必须的: 如:#ifndef MY_HEAD_H /头文件开头,名字是任意的,注意不要和其它头文件冲突 头文件声明 #endif /头文件结尾有时候,在b.h中会include a.h 在c.h中会include b.h及includea.h, 这时,如果不用ifndef/endif,就会包含两次a.h,产生错误。条件编译,满足条件就编译,否则就不编译,如果有一段代码有时候你想要,有时候又不想编译(比如为了调试),可以这样写: #if 1(0) xxxxxx xxxxxx #endif 需要的时候写1,不要的时候改为0就可以了文件中的#ifndef头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:#ifndef #define .#endif在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h#ifndef _STDIO_H_#define _STDIO_H_.#endif2.在#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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购房合同样本-多篇
- 专科《预防医学》试题及答案
- 财会系毕业论文模板
- 2025年度道路维修施工监理合同
- phdemel专业怎么学毕业论文
- 风电场电气系统设计方案
- 2025年《工伤保险条例》知识竞赛试题及答案
- 海事专业毕业论文课题
- 2025年新生儿黄疸的护理查房
- 风电场风机运行优化方案
- 网约车司机安全培训
- 数据安全风险评估报告
- 细胞学科普讲座模板
- 1云南省建设工程施工图设计文件审查工作流程
- 混凝土劳务加工合同模板
- 2019新教材人教版生物必修1整本教材课后习题全部答案
- 大气污染治理技术实施方案
- 吊篮作业人员安全技术交底
- 1《哦香雪》公开课一等奖创新教学设计统编版高中语文必修上册
- 2024-2030年中国天然气制合成油行业需求量预测与营销战略分析研究报告
- 直播电商监管的国际比较与借鉴
评论
0/150
提交评论