现在的位置: 首页 > 综合 > 正文

预处理器

2012年09月10日 ⁄ 综合 ⁄ 共 1566字 ⁄ 字号 评论关闭

所有的C编译器软件包都提供了预处理器。编译C程序时,程序首先由编译器中的预处理器进行处理。在大多数C编译器中,预处理器都被集成到编译器程序中。当您运行编译器时,它将自动运行预处理器。预处理器根据源代码中的指令(预处理器编译指令)对源代码进行修改。预处理输出修改后的源代码文件,然后,该输出被用作下一个编译步骤地输入。

预处理器会处理相关的预处理指令,一般是以"#"开头的指令。如:#include "xx.h" #define等。编译器把对应的*.cpp翻译成*.s文件(汇编语言)。 汇编器则处理*.s生成对应的*.o文件(obj目标文件)最后链接器把所有的*.o文件链接成一个可执行文件(?.exe);

1.#define 预处理器编译指令

  #define将一种文本替换为另一种文本。例如,要将text1替换为text2,可以这样编写代码:

#define text1 text2

上述编译指令导致预编译器将源代码文件中的所有text1替换为text2,但如果text1位于双引号中,则不替换。

2:

也可以使用编译指令#define来创建函数宏。函数宏是一种简写,使用简单的东西来表示复杂的东西。其名称中之所以包含“函数”两字,是因为这种宏能够接受参数,就像真正的函数那样。函数红的优点之一是,其参数对类型不敏感。因此,您可以将任何数值类型的变量传递给接受数值参数的宏。例如下面的预处理器编译指令:

#define HALFOF(value) ((value)/2)

定义了一个名为HALFOF的宏,该宏接受一个名为value的参数。预处理器将源代码中的所有HALFOF宏替换为相应的定义文本,并在必要时插入参数。因此,下面的代码行:

result = HALFOF(10);

将被替换为:

result = ((10)/2);

3.使用编译指令#include

遇到编译指令#include时,预处理器读取指定文件,并将其插入该编译指令所在的位置。在编译指令#include中,不能使用通配符*或?来包含一组文件,但可以嵌套编译指令#include。大多数编译器都对嵌套深度有一定的限制,对于支持ANSI标准的编译器,通常嵌套深度可达15层。

在编译指令#include中指定文件名的方式有两种。如果文件名用尖括号括起,如#include<stdio.h>,则预处理器将首先在标准目录中查找该文件,如果没有找到或没有指定标准目录,则编译器将在当前目录中查找。

4.使用#if、#elif、#else和#endif

这四个预处理器编译指令用于控制有条件的编译。有条件的编译意味着仅当特定的条件满足时,才对源代码块进行编译。在很多方面,预处理编译指令#if与if语句类似,区别在于,if语句控制特定的语句是否执行,而#if控制是否编译。

#if使用的测试表达式可以是结果为常量的任何表达式。不能使用sizeof()运算符、强制类型转换或float类型。#if最常用于检测#define编译指令创建的符号常量。

其中每个Statement_block由一条或多条语句组成,这些语句可以是任何类型的语句,包括预处理编译指令。无需使用花括号将他们括起,虽然也可以这样做。

注意:#if…#endif结构中的语句块最多有一个被编译。如果其中没有#else编译指令,则可能没有任何语句被编译。还可以使用#if…#endif 来帮助调试。

5.避免将头文件包含多次

   随着程序增大或使用头文件越来越频繁,很可能无意间包含一个头文件多次。这可能导致编译器感到迷惑,而停滞编译。

6.#undef编译指令

  #undef编译指令的功能与#define相反,它撤销对名称的定义。可以使用#undef和#define来创建只在源代码的某些部分被定义的名称。结合使用这种功能和#if编译指令,可以更好地控制条件编译。

【上篇】
【下篇】

抱歉!评论已关闭.