目录
一.宏
宏(英语:Macro)是一种批量处理的称谓。
计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
二.宏定义
c程序提供的预处理功能之一。包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。形式为:
#define标志符[(参数表)] 字符串
#define name( parament-list ) stuff
宏名
在上定义中的标志符被称为“宏名”。
宏展开
在c程序编译时将宏名替换成字符串的过程称为“宏展开”。
三.#define 替换规则
例:
//举个例子 !
#define MAX 1000
int main()
{
int a = MAX; // int a = 1000 ;
printf("%d", a);
return 0;
}
#define reg register
//为 register这个关键字,创建一个简短的名字(不建议 降低代码可读性)
int main()
{
reg int m; //register int m ;
return 0;
}
#define do_forever for(;;) //用更形象的符号来替换一种实现
int main()
{
do_forever; // for(;;); // 实现死循环
return 0;
}
存在此类用法 , 但不建议这样使用 ,因为这样使用会大大降低代码的可读性!
代码分析:
有下面一串代码请分析运行结果:
#include<stdio.h>
#define SQUARE(x) x * x
int main()
{
int a = SQUARE(5 + 5);
printf("%d", a);
return 0;
}
答案是: 35
刚开始,你可能觉得这段代码将打印的是 10 * 10 乘积的值。 事实上它将打印35. 为什么?
替换文本时,参数x被替换成 5 + 5, 所以这条语句实际上变成了:
printf("%d\n", 5 + 5 * 5 + 5); // 5 + 25 + 5 = 35提示:所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。
四,宏和函数对比
宏的优点
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(num, type)(type *)malloc(num * sizeof(type))
int main()
{
int* p;
p = MALLOC(10, int);//类型作为参数 预处理器替换之后:
//等同于 p = (int*)malloc(10 * sizeof(int));
free(p);
p = NULL;
return 0;
}
宏的缺点
五,练习巩固
//题目1.
#include <stdio.h>
#define M(x,y) x-y
void main()
{
int a = 4, b = 3, c = 5;
printf("%d", a * M(b, c));
}
//A.8 B. 7
//C.编译错误 D. - 8
//题目2.
#include <stdio.h>
#define MIN(x,y) (x)<(y)?(x):(y)
void main()
{
int i, j, k;
i = 10; j = 15;
k = 10 * MIN(i, j);
printf("%d\n", k);
}
//A.15 B. 10
//C.100 D. 150