预处理指令

C语言允许在源程序中加入一些"预处理指令"(pr eprocessingdirective) ,以改进程序

设计环境,提高编程效率。。这些预处理指令是由C标准建议的,但它不是C语言本身的组

成部分,不能用C编译系统直接对它们进行编译(因为编译程序不能识别它们)。必须在对

程序进行正式编译(包括词法和语法分析、代码生成、优化等)之前,先对程序中这些特殊的

指令进行"预处理"(preprocess,也称"编译预处理"或"预编译"。)。把预处理指令转换成相

应的程序段,它们和程序中的其他部分组成真正的C语言程序,对预处理指令进行的预处

理工作,是由称为C预处理器(preprocessor)的程序负责处理的。

在预处理阶段,预处理器把程序中的注释全部删除;对预处理指令进行处理,如把

#include指令指定的头文件(如stdio.h)的内容复制到#include指令处;对#define指令,

进行指定的字符替换(如将程序中的符号常量用指定的字符串代替),同时删去预处理指令。

现在使用的许多C编译系统把C预处理器

作为C编译系统的一个组成部分,在编译时一气呵成。因此有的用户误认为预处理指令是

C语言的一部分,甚至以为它们是C语句,这是不对的。必须正确区别预处理指令和C语

句,区别预处理和编译,才能正确使用预处理指令。C语言与其他高级语言的一个重要区别

是可以使用预处理指令和具有预处理的功能。

C提供的预处理功能常用的主要有以下3种:

(1)宏定义;

(2)文件包含;

(3)条件编译。

这些功能分别用宏定义指令、文件包含指令和条件编译指令来实现。为了与C语句相
区别,这些指令以符号"#"开头,指令后面没有分号。

宏定义

  1. 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
  2. 当需要改变某一个常量时,可以只改变#define指令行,一改全改。
  3. 宏定义只是用宏名代替一个字符串,也就是只作简单的置换,不作正确性检查。预处理时不作任何语法检查。只有对已被宏展开后的源程序进行编译时才会发现语法错误并报错。
  4. 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。会出现语法错误。
  5. #define指令出现在程序中的函数的外面,宏名的有效范围为该指令行起到本源
    文件结束。通常,#define指令写在文件开头,函数之前,作为文件一部分,在整个文件范围内有效。可以用#undef指令终止宏定义的作用域。 由于#undef的作用,使G的作用范围到#undef指令的前一行,因此在f1函数中,G
    不再代表9.8。这样可以灵活控制宏定义的作用范围。
  6. 宏定义与定义变量的含义不同,不分配存储空间。不带参数的宏定义只作简单的
    字符替换,千万不要把宏名当作变量名使用。

不带参数的宏定义

不带参数的宏定义是比较简单的,就是用一个指定的标识符(即名字)来代表一个字符

串。它的一般形式为
#define 标识符 字符串

define PI 3. 1415926

它的作用是:在本程序文件中用指定的标识符PI来代替3.1415926这个字符串。在

进行预处理时,将程序中凡是在该指令以后出现的所有的PI都用3.1415926代替。这种方

法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名",

在预处理时将宏名替换成字符串的过程称为"宏展开"。#define就是宏定义指令。

带参数的宏定义

带参数的宏定义不是进行简单的字符串替换,还要进行参数替换。其定义的一般形

式为:

#define 宏名(参数表)字符串

字符串中包含在括号中所指定的参数。例如:

define S(a b) a*b

area=S(3,2);

以上定义矩形面积S,a和b是边长。在程序中用了S(3,2),把3和2分别代替宏定义

中的形式参数a和b,即用 3*2 取代(3,2)。因此赋值语句置换为

area=S(3,2)=3*2;

对带参数的宏定义是这样进行展开置换的:在程序中如果有带实参的宏(如S(3,2)),

则按#define指令行中指定的字符串从左到右进行置换。

如果字符串

中包含宏中的形参(如a,b),则将程序语句中相应的实参(可以是#defineS(a,b)a*b

常量、变量或表达式)代替形参。

如果宏定义中的字符串中的字

符不是参数字符(如 a*b 中的*号),则保留。这样就形成了置

换的字符串,

相关推荐
LDR0062 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
Luminous.2 天前
C语言--day30
c语言·开发语言
玖玥拾2 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽2 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
2601_951643882 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
m0_547486662 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
✎ ﹏梦醒͜ღ҉繁华落℘2 天前
编程基础 --高内聚,低耦合
c语言·单片机
QK_002 天前
C语言 static 关键字三大作用
c语言·开发语言
隔窗听雨眠2 天前
C语言函数递归从入门到精通(下):性能优化与工程实践
c语言·算法·性能优化