C语言之预处理指令和宏定义
C语言之预处理指令和宏定义
一.预处理命令基本介绍
1.以#号开头的命令称为预处理命令。
2.在编译之前对源文件进行简单加工的过程,就称为预处理。
3.预处理主要是处理以#开头的命令,它的位置要放在所有函数之外,而且一般都放在源文件的前面。
4.预处理是C语言的一个重要功能,由预处理程序完成。当对源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
5.C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理的使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序。
eg:
开发一个C语言程序,让它暂停5秒后输出,并且要求跨平台,在Windows和Linux下
都能运行。
二.C语言之宏定义的基本介绍
1.#define 叫做宏定义命令,它也是C语言预处理命令的一种。宏定义,就是用标识符来表示一个字符串,代码中出现了标识符就全部替换成了指定字符串。
2.宏定义的形式(#define 宏名 字符串)
说明:
(1)宏名的命名规则和变量相同。
(2)字符串可以是数字,表达式,if语句,函数等。
(3)字符串不需要加双引号
(4)程序中反复使用的表达式就可以使用宏定义
eg:
#define N 100
N为宏名,100是宏的内容(宏所表示的字符串)
三.宏定义的注意事项和细节
1.宏定义只是作简单替换,若有错误,只能在编译已被宏展开后的源程序时被发现。
2.注意宏定义结尾没有分号。
3.宏定义必须在函数外,作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
eg:
#define PI 3.1415926
int main()
{
printf(“PI = %.2f”,PI);
return 0;
}
#undef PI //取消宏定义,取消后下面就不能使用到PI了
4.宏定义允许嵌套。
5.宏名若被双引号包围,则不会对其作宏代替。
6.习惯上宏名用大写字母表示,以便与变量区别。但也允许小写。
7.可用宏定义表示数据类型,使书写方便。
eg:
#define UINT unsigned int
void main(){
UINT a,b;
}
8.宏定义表示数据类型和用typedef定义数据说明符的区别:
宏定义只是简单的字符串替换,由预处理器来处理;typedef是在编译阶段由编译器处理的,它并不是简单的字符串替换,而是给原有的数据类型起了一个新的名字,将它作为一种新的数据类型。
四.带参数的宏定义基本介绍
1.C语言允许宏带有参数。宏中定义的参数称为“形式参数”,在宏调用中用的参数称为“实际参数”。
2.对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。
3.带参宏定义的一般形式为:
#define 宏名(形参列表) 字符串
eg:
#define MAX(a,b) (a > b) ? a : b
4.带参宏调用的一般形式为:
宏名(实参列表)
eg:
五.带参宏定义的注意事项和细节
1.宏名和形参列表之间不能有空格出现。
2.在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。
3.字符串内的形参通常要用括号括起来以避免出错。
eg:
#define MAX(a,b) (a>b)?(a):(b)
六.带参宏定义和函数的区别
1.宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。
2.函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
eg:
七.C语言之预处理命令总结
预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
一些预处理命令总结如下图: