编译预处理
(5+6)*(5+6)
20实质:就是用指定的文件的内容替换文件包含命令 命令的一般形式为: 格式1:#include <文件名> 格式2:#include "文件名" 例如: #include <stdio.h> #include "stdio.h"
2020/2/19
}
2020/2/19
5
9.1 宏定义
2.带参宏定义
格式:#define 标示符(形参表) 形参表达式
例如:#define MAX(a,b) (a>b)?(a):(b)
进行宏替换时,可以像使用函数一样,通过实参与
形参传递数据。
#define FUN(a) a*a
main()
{
int i,s=0;
for(i=1;i<=10;i++)
预处理的命令有以下几个特点: 1.预处理命令均以#开头,结尾不加分号; 2.预处理命令可以放在程序中任何位置,作用范围 从定义处到文件结尾。
2020/2/19
3
9.1 宏定义
1.无参宏定义 格式: #define 宏名 字符串 功能:程序中用宏名表示字符串,编译预处理时用字 符串替换宏名。 说明: (1)define为宏定义命令,宏名一般用大写字母表示, 字符串可以是常数、表达式、格式串等。 (2)宏定义必须写在函数之外,其作用域为宏定义命令 起到源程序结束。如要终止其作用域可使用如下语句 :# undef 宏名
s=s+FUN(i);
printf("%d\n",s);
}
2020/2/19
6
9.1 宏定义
说明: (1)宏名和括号之间不能有空格 (2)宏替换只作简单的替换,设有如下宏定义: #define S(x) x*x 则S(5+6)将被 替换为:
5+6*5+6 若宏定义为: #define S(x) (x)*(x) S(5+6)就会被替换为:
程序段1 #else
程序段2 #endif 【功能】如果标识符未被#define命令定义过则 对程序段1进行编译, 否则对程序段2进行编译。
2020/2/19
11
9.3 条件编译
3. 第三种形式: #if 常量表达式
程序段1 #else
程序段2 #endif
#define NUM 2008 main() { #ifdef NUM
2020/2/19
4
9.1 宏定义
(3) 宏名在源程序中若用引号括起来,则预处理程序
不对其作宏代换;
#define PI 3.14159
main()
{ float s,l,r;
printf("input r:");
scanf("%f",&r);
s=PI*r*r;
l=2*PI*r;
printf("s=%f,l=%f\n",s,l);
第九章 编译预处理
2020/2/19
1
概述
编译预处理是指在进行编译之前,系统自动引用 预处理程序对源程序中的预处理部分作处理,处理完 毕自动进入对源程序的编译,过程如下图:
C源程序(无预处理命令)
编译
C源程序(有预处理命令) 预处理 编译
目标程序 连接 执行程序
2020/2/19
2
概述
C语言提供了多种预处理功能,如宏定义、文件包 含、 条件编译等。合理地使用预处理功能有利于程序 的便于阅读、修改、 移植和调试,也有利于模块化程 序设计。
8
9.2 文件包含
关于文件包含的几点说明: (1) 使用格式1时,预处理程序在C编译系统定义的标 准目录下查找指定的文件; (2) 使用格式2时,预处理程序首先在当前源文件所 在目录下查找指定文件,如没找到,则在C编译系统 定义的标准目录下查找指定的文件; (3) 一个#include命令只能包含一个文件,而且必须 是文本文件; (4) 文件包含可以嵌套,如a包含b,b包含c。
printf("%d",1234); #else printf(“%d",6789); #endif }
【功能】如常量表达式值为真(非0),则对程序段
1 进行编译,否则对程序段2进行编译。
2020/2/19
12
2020/2/19
13
2020/2/19
14
2020/2/19
9
9.3 条件编译
条件编译有三种形式, 1. 第一种形式: #ifdef 标识符
程序段1 #else
程序段2 #endif 【功能】如果标识符已被 #define命令定义过则对 程序段1进行编译;否则对程序段2进行编译。
2020/2/19
10
9.3 条件编译
2. 第二种形式: #ifndef 标识符