宏:
1:宏经常用来定义常量,宏在编译器预处理的时候会被展开,我们可以使用宏来代替一些逻辑
例如:
#include<stdio.h>
#define MAXSIZE 255
#define BEGIN {
#define END }
#define FOREACH for(i = 0; i<size; i++)
int main()
{
int i = 0, size = 100;
FOREACH
BEGIN
printf("%d\r\n", i);
END
return 0;
}
2:宏里面还可以接收占位符!这种宏称之为函数宏!!
#include<stdio.h>
#define size 255
#define BEGIN {
#define END }
#define FOREACH(a,b) for(a = 0; a<b; a++)
int main()
{
int i = 0, size = 100;
FOREACH(i, size)
BEGIN
printf("%d\r\n", i);
END
return 0;
}
函数宏相当于可以接收参数的传入,他会替换。但是printf()的时候还是要使用原本的参数,不可以使用a和b,a和b只是占位符。
宏无论定义在什么地方,在定义宏代码后面左右的地方都可以再使用这个宏,与定义在函数里面还是外面无关。
宏定以后还可以使用#undef来注销掉。
系统也提供有一些默认好的宏。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 255
#define BEGIN {
#define END }
#define FOREACH(a,b) for(a;a<b;a++)
#define SUM(a,b) a+b
#define DIM(a) sizeof(a)/sizeof(*a)
#define MALLOC(type,x) (type*)malloc(sizeof(type)*x)
//所有的宏都是纯粹的替换,所以有的时候也容易出问题。例如:
#define MAX(a,b) a>b?a:b
int main()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int i = 0;
FOREACH(i, DIM(array))
BEGIN
printf("%d\r\n", SUM(array[i], array[SUM(i, 1)]));
END//打印3 5 7 9 11 13 15 ?(未定义值)
int *p = malloc(sizeof(int) * 5);
int *pp = MALLOC(int, 5);
int a = 3, b = 2, c = 1;
printf("%d", MAX(a, MAX(b, c)));//这里没出问题,打印的3。
// a> b>c?b:c ? a : b>c?b:c //大于的优先级会比三目运算符高!容易出问题。
#undef MAX
//printf("%d", MAX(a, b));//这句话无法再调用MAX这个宏
printf("%s\r\n", __FILE__);
printf("%d\r\n", __LINE__);
printf("%s\r\n", __DATE__);//任何一个编译器都可以用这三个默认的宏
return 0;
}//写宏的时候一定要注意优先级的问题,出错也经常是因为优先级出错。