------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.预处理的概念
2.C语言中的预处理功能
C语言提供的预处理功能主要有一下三种:
宏定义;
#define 标识符 字符串
(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3) 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。
(4) 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。
(5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,
在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。
(7) 在进行宏定义时,可以引用已定义的宏名,可以层层置换。
(8) 对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
#define宏名(参数表) 字符串
带参数的宏定义不是简单的替换,展开时还要进行参数的替换。#define S(a, b) a*b
area = S(1,1) => area = 1*1
#include <stdio.h>
#define PI 3.1415926
#define S(r)PI*r*r
void main()
{
float a,area;
a=3.6;
area=S(a);
printf("r=%f\narea=%f\n",a,area);
}
宏定义不占运行时间,只是占用编译的时间,而函数占用运行时间,但是宏定义的展开可能使程序变长,而函数则不会。文件包含;
条件编译
所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。
#ifdef 标识符
程序段1
#else
程序段2
#endif
如果定义了这样的宏,就执行语句
#ifndef 标识符
程序段1
#else
程序段2
#endif
如果没有定义这样的宏名,就执行语句