什么是预编译?

933阅读 0评论2011-09-25 A13433758072
分类:

http://hi.baidu.com/mlstudy/blog/item/2e5d98cf2f66540a93457e2c.html
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等 
  就是为编译做的预备工作的阶段
  主要处理#开始的预编译指令
  预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有: 
  (1)#include 指令 
  该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"hpp"的头文件。 
  注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。 
  (2)#define指令 
  该指令有三种用法: 
  第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用; 
  第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1); 
  第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。 
  (3)#if、#else和#endif指令 
  这些指令一般这样配合使用: 
  #if defined(标识) //如果定义了标识 
  要执行的指令 
  #else 
  要执行的指令 
  #endif 
  在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构: 
  #if !(defined XXX) //XXX为一个在你的程序中唯一的标识符, 
  //每个头文件的标识符都不应相同。 
  //起标识符的常见方法是若头文件名为"abc.h" 
  //则标识为"abc_h" 
  #define XXX 
  真正的内容,如函数声明之类 
  #endif 
  注1:因为:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。 
  注2:例如get_max(a++, b)时,a++会被执行多少次取决于a和b的大小!所以建议还是用内联函数而不是这种方法提高速度。虽然有这样的弊病,但这种方法的确非常灵活,因为a和b可以是各种数据类型
上一篇:【转载】指针参数是如何传递内存的?
下一篇:关于malloc(0)的问题