预编译处理

来源:互联网 发布:印度火星探测知乎 编辑:程序博客网 时间:2024/06/06 22:01


 主要使用的预编译处理指令有下面9个:
     #define #undef #include #if #elif  #else #endif #ifndef # ifdef
 预处理命令共同的语法规则有下面6条:
 所有的预处理命令在程序中都是以“#”来引导
 每一条预处理命令必须独占一行,在一行中写#include "stdio.h" #include <stdlib.h>是非法的。
 预处理命令后不可以加分号
 预处理命令一行写不下,可以续行,但要加续行符,"/"
 宏定义与文件包含命令一般放在程序开头,(原则上放到任何地方)
 所有预处理命令作用域都是从定义开始到程序结束


 宏定义
 不带参数的宏定义
 #define 宏名 字符串
 在程序执行中,遇到宏名,将进行宏替换。
 定义了宏以后,如果在程序某个部分不想再用或者想将宏名重新定义,应先用  #undef 宏名    结束某个某定义
 若宏名用引号括起来,则当成一般字符串处理
 
 带参数的宏定义
 #define <宏名>(<参数表>)   <宏体>
 需要注意的是括号在带参数的宏定义中的使用: 如#define SQ(x) x*x 与
 #define SQ(x) (x)*(x)的区别。
 
 带参数的宏与函数的区别:
 函数的形参与实参都要求定义类型,而且两者要求一致,若不同,还要进行强制类型转换。而宏不存在此类问题,宏没有类型,

参数也无类型,它们都只是一种符号代表,宏展开时将它们进行代换。
 在程序中使用宏,宏展开后源程序会变长。而函数调用不会。
 宏替换不占用程序运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。
 
 条件编译指令
 有时希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
 1.#if~#endif:
 #if 常量表达式
 程序段          /*当常量表达式的结果为非0时,编译或保留程序段*/
 #endif
 
 2.#if ~#else ~#endif:
 #if 常量表达式
 程序段1            /*当常量表达式的值为非0时,编译或保留程序段1*/
 #else
 程序段0    /*当常量表达式的值为0时,编译或保留程序段0*/
 #endif
 
 #ifdef  标志符
   程序段1
 #else                  /*如果不需要,可以不用#else部分*/
   程序段2
  #endif

 #ifndef  标志符
 程序段1
 #else
  程序段2
#endif


结束:常用的三种预处理命令:宏定义,文件包含,条件编译。
 在使用宏定义的时候要特别注意括号的使用
 关于预处理命令还有许多细节需要注意的地方,如,使用宏还是使用函数好?用#define有什么好处?。。。我只陈列了一些常

用的需要记忆的部分抛砖引玉。