设置密码

验证码错误,请重新填写

免费建站旅程马上开始

开始建站
建站中

已有帐号?直接登录

首页>森动学院>网站建设教程 > 编程必备手册第四章:C语言中的预处理
编程必备手册第四章:C语言中的预处理
发布时间: 2014-05-16
学c语言之初,一提到预处理,脑子里想到的就是#define的宏定义以及#include包含的头文件。其实所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。

C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。

在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。预编译的主要作用如下:
●将源文件中以”include”格式包含的文件复制到编译的源文件中。
●用实际值替换用“#define”定义的字符串。
●根据“#if”后面的条件决定需要编译的代码。

1. #define
最常用的预处理器命令就是define命令,该预处理器命令有三部分组成:#define本身、符号缩略语、替换列表(或称为主体)。
结构可写为:#define 宏 主体        其中宏部分不能有空格,只能是数字、下划线、字母,但第一个字符不能使数字。
如:#define PX printf("x is %d.n", x)
预处理器发现程序中的宏后,会用它的等价替换文件代替宏。如果该字符串中还包括宏,则继续替换这些宏。如果宏出现在双引号中,则不做替换。如果在双引号中出现的宏前面有“#运算符”,则可以用宏参数创建字符串。如:
#define PSQR(X) printf("The square of X is %d.n", ((X)*(X)))
PSQR(8)   //等价于printf("The square of X is %d.n", ((8)*(8))),输出The square of X is 64.
#define PSQR(X) printf("The square of "#X" is %d.n", ((X)*(X)))

PSQR(8)   //等价于printf("The square of 8 is %d.n", ((8)*(8))),输出The square of8 is 64.
小结:引号中的字符中中的X被看作普通文本,而不是被看作一个可替换的语言符号。#符号用作一个预处理运算符,它可以把语言符号转化为字符串。

预处理器的粘合剂:##运算符。和上面的#运算符一样,##运算符可以用于类函数宏的替换部分。##还能用于类对象宏的替换部分,把两个符号组合成单个语言符号,如:
#define XNAME(n) x##n
XNAME(4)  //等价于x4

从宏的定义和使用可以看出,它与函数非常相近,但宏与函数又有所不同,他们的选择实际上是时间和空间的权衡。宏产生内联代码,也就是说在程序中产生语句。如果使用宏20次,则会把20行代码插入程序中,如果使用函数20次,那么程序中只有一份函数的语句拷贝,因此节省了空间。另一方面,程序的控制必须转移到函数中并随后返回调用程序,因此这比内联代码话费的时间多。

2.#include
预处理器发现#include指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件的文本将替换源代码文件中的#include指令,就像把被保护文件中的全部内容键入到源文件中的这个特定位置一样。
#include     // 文件放在尖括号中,搜索系统工作目录
#include “name.h”     // 文件名放在双引号中,搜索当前工作目录
#include "/dir1/dir2/name.h" // 搜索/dir1/dir2目录
头文件中一般包含的内容有:明显常量、宏函数、函数声明、结构体模板定义、类型定义

3. 其他指令
#undef指令取消前面的#define定义。#if #ifdef #ifndef #else #elif #endif指令可用于选择什么情况下编译哪些代码。#line指令用于重置行和文件信息,#error指令用于给出错误消息,#param指令用于想编译器发出指示

4. 预定义的宏:
__DATE__ : 进行预处理的日期
__FILE__  :代码当前源代码文件名的字符串文字
__LINE__ :代表当前源代码文件中的行号的整数常量
__STDC__ :设置为1时,表示该实现遵循C标准
__TIME__ : 源文件编译时间


文章来源:森动网小鱼儿,转载请注明出处!

更多资源:http://www.sendong.com/