学习笔记(15):C语言 从小白到大神: 入门篇-宏定义

立即学习:https://edu.csdn.net/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)宏替换只占编译时间,不占运行时间,而函数调用占运行时间(分配内存,传递参数,执行函数体,返回值等等);

你可能感兴趣的:(研发管理,c语言,c++,编程,程序设计,C/C++)