c 语言中预处理命令-”宏定义”


一、宏定义简介

在c语言的编写中,允许一个字符串代替一串字符串,我们将这种代替操作称之为“宏操作”。
宏定义格式:
#define 标识符 字符串
1.1 #define 宏定义命令 一个#define 只能定义一条宏,如果需要定义多条宏,需分多行并采用多个#define
1.2 标识符通常采用大写字母,字符串可以是变量 关键字 语句 表达式 函数 空白等等。
1.3 在编译器进行编译的前期,编译器会根据宏定义规则替换当前文件下所有同宏(标识符)相同的标识符进行替换。
宏定义分为:
不带参数宏定义;
带参数宏定义;


二、不带参数宏定义

2.1 不带参数宏定义:用标识符来代替一个字符串,或一串没有特殊字符(括号 下标号 表达式)的字符串,通常用于定义符号常量。
例:
#define AAA 1
#define BBB 0
#define TYPEINT int
以上的定义,将会使程序在编译之前,会将出现AAA BBB TYPEINT 标识符的地方都替换为 1 0 int,然后再进行编译

2.2 宏定义允许嵌套定义

例:
#define AAA 1
#define BBB 2
#define CCC AAA*BBB+10


2.3 不带参数宏定义优点

2.3.1 使用宏定义,可以对系统中比较常用并且较长的表达式,进行缩写。
2.3.2 使用宏定义设置程序中相关参数,方便程序的调整。

三、带参数宏定义

在宏定义中的参数称之为形参,在宏调用中使用的参数称之为实参。在进行编译器的替换时,需要进行字符串的替换,同时还要进行参数的替换。
宏定义形式如下:
#define 宏名(形参表) 字符串
使用方法:
宏名(实参)
例:
[root@localhost ~]#more test.c

#include “stdio.h”
#define FUN(a,b) (a>b?a:b)

int main(){
int a=10;
int b =20;
printf(“please show max number:%d”,FUN(a,b));
return 1;
}

四、带参数的宏和函数的区别

4.1 函数调用时,先得出参数的值,然后传入函数中进行计算;宏则只进行字符串替换,不进行计算;
4.2 函数调用发生在程序运行时;宏则是发生在编译时;
4.3 函数的形参和实参都需定义类型;宏定义时不用定义类型;
4.4 函数调用时,只有一个返回值;宏调用时候可以有很多个值发生变化;
4.5 函数不会使源代码变长;宏会使源代码变长;
4.6 函数调用会消耗程序运行时间,宏调用则不会消耗程序运行时间,只会增加程序编译时间;

五、使用宏定义时注意事项

5.1 宏定义通常采用大写字母来区别变量的定义。
5.2 宏定义就是用宏名来代替一串字符串,编译时,程序会自动将标识符等于宏名的地方采用字符串替换,这是一种简单的替换,不会做任何检查。
5.3 宏定义不是说明语句,行结束不需要使用分号结束,如果加上分号,替换的时候会将分号作为字符串的一部分 一起去替换标识符
5.4 宏参数定义时,宏名和形参之间不能有空格。
5.5 宏参定义时,形参 通常采用小括号。
5.6 宏命令的有效范围:宏命令定义在函数外部,则在整个程序文件中都有效。

5.7 可以采用undef 终止宏定义的有效范围。

例:
#define AAA 1
void main()
{
int a =AAA;

}
undef AAA
void funcion1()
{
int a=AAA;
}

//以上代码程序编译的时候,就会提示找不到AAA 的定义。