立即学习:https://edu.youkuaiyun.com/course/play/8088/165744?utm_source=blogtoedu
预处理(预编译)
C语言一般提供三种预处理功能:宏定义、文件包含、条件编译
宏定义:
1. 不带参数的宏定义:用一个指定的标识符来代表一个字符串
一般形式:#define 标识符(宏名) 字符串
(1)在预编译时将宏名替换成字符串的过程叫“宏展开”
(2)宏名一般使用大写字母
(3)宏定义不是C语句,不用在末尾加分号,若加了分号,会被一起替换过去
(4)#define命令出现在程序中的函数外面(一般在.cpp文件最上面),有效范围为#define之后到本源文件结束,不能跨文件使用
(5)可以使用#undef终止宏定义
(6)宏定义时可以引用已定义了的宏
(7)字符串内的字符,即使与宏名相同,也不进行替换
2. 带参数的宏定义
一般形式:#define 宏名(参数表) 字符串
#define S(a,b) a*b
result = S(2,3);//结果为2*3=6
对一般形式中的“字符串”,如果字符串中有宏名后列出的参数比如(a,b),则将程序语句中相应的实参代替形参,如果字符串中的字符不是参数字符,则保留
说明:
(1)如果输入
#define S(r) 3*r*r
int area;
area = S(1+5);//会变成area = 3*1+5*1+5而不是想要的3*(1+5)*(1+5)
可通过定义时加括号解决: #define S(r) 3*(r)*(r)
(2)宏定义时宏名和带参数的括号之间不能加空格,否则空格以后内容都会成为字符串的一部分
3. 宏定义与函数的区别
(1)函数调用是先求出实参表达式的值,然后带入形参,带参宏只进行简单的字符替换,宏展开时并不求值,比如上边的S(1+5),宏展开时并不求1+5的值,只是原样用实参替换掉形参。
(2)函数调用是在程序运行时处理,分配临时内存。宏展开是在编译时进行的,展开时不分配内存单元,也不存在值传递的概念,当然也没有返回值的这个说法;
(3)宏的参数没有类型这个说法,只是个符号,展开时带入指定字符;
(4)使用宏次数多时,宏展开后源程序长,每展开 一次都是程序增长,函数调用不会使源程序变长。
(5)宏替换只占编译时间,不占运行时间,而函数调用占运行时间(分配内存,传递参数,执行函数体,返回值等等);