第11章 预处理指令

预处理指令是由C标准建议的,但它不是C语言本身的组成不部分,不能用C编译系统直接对他们进行编译(因为编译系统不能识别它们)。必须在对程序进行正式编译(包括语法和语法分析、代码生成、优化等)之前,先对程序中这些特殊的指令进行“预处理把预处理指令转换成相应的程序段,它们和程序中的其他部分分组成真正的C语言程序,对预处理指令进行的预处理工作,是由成为C预处理器的程序负责处理的。

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

  1. 宏定义
  2. 文件包含
  3. 条件编译

指令以符号“#”开头,指令后面没有分号。

11.1  宏定义

11.1.1  不带参数的宏定义

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

例如  #define PI 3.1415926

作用: 指定的标识符 PI 来代替 3.1415926

例题:求圆的周长,圆面积、圆球的体积

#include<stdio.h>
#define PI 3.1415926
int main() {
	double r, l, s, v;
	printf("请输入圆的半径\n");
	scanf("%lf", &r);
	l = 2.0 * PI * r;
	s = PI * r * r;
	v = 4.0 / 3.0 * PI * r * r * r;
	printf("l=%5.2lf,v=%5.2lf%,v=%5.2lf", l, s, v);
	return 0;
}

注意:

  • 宏名建议用大写字母表示,以便与变量名区别。
  • 宏定义只是用宏名代替一个字符串,也就是作简单的置换,不做正确性的检查。
  • 宏定义不是C语句,不必在行末加分号

11.1.2  带参数的宏定义

一般形式为 #define 宏名 (参数表) 字符串

例如 :

#define S(a,b)a*b

area = S (1,2);

程序中S(1,2),把1和2分别代替宏定义中的形式参数a和b,即用1*2取代(1,2).area= 1*2;

例题:用带参数的宏求圆面积

#include<stdio.h>
#define PI 3.14
#define S(a,b) a*b*b
int main() {
	double r;
	printf("请输入圆的半径\n");
	scanf("%lf", &r);
	printf("圆的面积是%lf\n", S(PI, r));
	return 0;
}

注意:

  • 宏定义时,宏名和参数括号之间不能有空格,否则将空格之后的字符都替换

11.2  文件包含

前面多次使用过文件包含指令,例如:

#include<stdio.h>

所谓"文件包含"处理是指一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件内容包含到本文件之中,即插入到当前的位置。

一般形式为:

#include "文件名"

#include <文件名>

11.3  条件编译

源文件中所有的行都参加编译。但是有时希望程序中的一部分内容只在满足条件才进行编译,也就是对这一部分内容指定编译的条件,这就是"条件编译"。

(1)#ifdef 标识符

程序段1

       #else

程序段2

#endif

作用:

若指定标识符已经被#define指令定义过,则在程序中编译阶段对程序段1进行编译,否则编译程序段2.。

实际上,预处理器是这样执行的,当发现所指定的标识符已经被#define指令定义过,就保留程序段1,而忽略程序段2(把程序2删除),否则就保留程序段2,而忽略程序段1.

#ifdef  标识符

程序段

#endif
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值