宏的作用:
在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
宏的优缺点:
优点:
宏通常被应用于执行简单的运算,它比函数在程序的规模和速度方面更胜一筹,同时宏是与类型无关的。
缺点:
1)每次使用宏时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长。
2)宏是不方便调试的。
3)宏是不能递归的 。
4)宏可能会带来运算符优先级的问题,导致程容易出现错误
宏常用于:
1.转字符串
注意当宏参数是另一个宏的时候,凡宏定义里有用’#’或’##’的地方宏参数是不会再展开, 需要加多一层中间转换宏才可以解决宏参数的转换。
例如:
#define _STR(x) #x
#define STR(x) _STR(x)
#define MAX 100
STR(MAX) ---------> "100"
2.转字符
#define B(x) #@x
B(1)------> '1' ( #@x , #@ 符号会将宏的参数进行字符串字面量化,并且加‘’号)
3.粘黏符
#define A(x) T_##x
A(1)------> T_1 (T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
#define B(a,b) int(a##e##b)
B(2,3)------>2e3 输出:2000
4.比较大小
注意多使用括号
#define MAX(x,y) ((x)>(y)?(x):(y))
5.多行定义
//分配内存
#define MALLOC(n, type) \
( (type *) malloc((n)* sizeof(type)))
//交换两个变量的值
#define swap(x,y,T) do { \
T temp = (*x);\
(*x) = (*y); \
(*y) = temp; \
} while (0)
int a = 5;
int b = 9;
swap(&a,&b,int); //输出9,5