预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。
   关于预处理命令中的文件包含(#include),宏定义(#define),书上已经有了详细的说明,在这里就不详述了。这里主要是对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况:
  1:情况1:
  #ifdef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
   这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
  例:
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
  #else
   printf("之前NUM没有过定义!:( \n");
  #endif
  }
   如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
   我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
  2:情况2:
  #ifndef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
   这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
  3:情况3:
  #if 常量
  ...程序段1...
  #else
  ...程序段2...
  #endif
   这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
   我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0。
  
我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:

  1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。

  在程序首部定义#ifdef HNLD:

  #ifdef HNLD

  #include"n166_hn.c"

  #endif

  如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。

  2.在每一个子程序前加上标记,以便追踪程序的运行。

  #ifdef DEBUG

  printf(" Now is in hunan !");

  #endif

  3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:

  #ifndef TEST

  i=dial();

  //程序调试运行时绕过此语句

  #else

  i=0;

  #endif

  调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。

转:http://bbs.csdn.net/topics/210046082

最新文章

  1. Java对象大小计算
  2. 高性能 Oracle JDBC 编程
  3. VMWare虚拟机 使用vmtools拷贝文件 临时文件问题
  4. ----------jqery和js如何判断checkbox是否选中 --------两个单选按钮如何选一个,且用jquery获取被选的值
  5. HIT2543 Stone IV(一定费用内的最大流)
  6. 常​用​的​邮​箱​服​务​器​(​S​M​T​P​、​P​O​P​3​)​地​址​、​端​口
  7. jQuery_效果(隐藏和显示)
  8. 1059: [ZJOI2007]矩阵游戏 - BZOJ
  9. 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
  10. 从零开始PHP学习 - 第四天
  11. C语言第一次实验报告
  12. 应用服务器GC回收常见问题总结
  13. Springboot读取Jar文件中的resource
  14. XIII Open Grodno SU Championship
  15. Web Api使用Swagger提供在线文档
  16. 820板子安装python
  17. 关于在html中直接引入less文件遇到的小问题
  18. PHP随机生成要求位数个字符(大小写字母+数字)
  19. Input标签_实现限制输入字符类型(只能输入特定类型字符)
  20. web进修之—Hibernate HQL(7)

热门文章

  1. python文件操作及格式化输出
  2. python基础类型 —— Sets集合
  3. SqlServer 中查询子节对应的上级自定义函数
  4. Java编程的逻辑 (32) - 剖析日期和时间
  5. MediatR 中介模式
  6. ngResource和REST介绍
  7. 【BZOJ】4561: [JLoi2016]圆的异或并
  8. shell编程快速入门及实战
  9. csp刷题
  10. 系统的Drawable(四)-LayerListDrawable