CC指令#undef#ifdef#ifndef#if的用法.docxVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CC指令#undef#ifdef#ifndef#if的用法

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

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档