预编译

预编译又称为预处理,是做些代码文本的替换工作

  处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等。如文件包含#include、 宏定义、条件编译指令预处理

Microsoft   C   和   C++   编译器提供了用于预编译任何   C   或   C++   代码(包括内联代码)的选项。利用此性能特性,可以编译稳定的代码体,将已编译状态的代码存储在文件中,以及在随后的编译中,将预编译的代码与仍在开发的代码结合起来。由于不需要重新编译稳定代码,因此后面每次编译的速度都要快一些。 预编译代码有助于在开发周期中缩短编译时间,特别是在以下情况中:  
1.总是使用不经常改动的大型代码体。  
2.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头.pch文件。  
用于创建预编译头文件的第一次编译所花费的时间比后面的编译稍长一些。通过包含预编译代码可以加快后面的编译速度。

  预编译指令指示了在程序正式编译前就由 编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有:
   (1)#include 指令
  该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在 当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"cpp"的头文件。
  注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。
   (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可以是各种数据类型。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值