//#difine 定义标识符之后 尽量不使用分号。
#define 宏定义 可以带参数。宏是完全替换,而不是传参的。
#include<stdio.h>
#define SUB(x,y) x-y
#define MUL(x) x*x
#define DOUBLE(x) ((x)+(x)) //定义宏的时候不要吝啬括号。存在计算优先级的问题。
int main(void)
{
int a = SUB(10, 2); //10-2=8
printf("%d \n",a);
printf("%d \n",b);
printf("%d \n",c);
return 0;
}
//宏参数创建字符串: #运算符
#include<stdio.h>
#define PSQR(x) printf("The square of "#x" is %d.\n",((x)*(x)))
int main(void)
{
int a = 5;
PSQR(10);
PSQR(1 + 2);
return 0;
}
// 预处理粘合剂:## 运算符
#include<stdio.h>// int b = MUL(1 + 2);//1+2*1+2=5 计算顺序有优先级。
// int c = 10 * DOUBLE(2);// 40
#define XADD(n) x ## n
#define PXADD(n) printf("x "#n" =%d \n",x##n);
int main(void)
{
int XADD(1) = 1; //int x1=1
int XADD(2) = 2;
int x3 = 3;
PXADD(1);// printf("x1= \n",x1)
PXADD(2);
PXADD(3);
return 0;
}
//慎用宏参数
#include<stdio.h>
#define MAX(x,y) (x)>(y)? (x):(y)
int main(void)
{
int a = 10;
int b = 11;
int ret=MAX(a++, b++);//宏定义的副作用。
printf("%d \n", ret);// 12
printf("%d \n",a);// 11
printf("%d \n", b);// 13
return 0;
}
//对比函数的方式和宏的方式
#include<stdio.h>
int Add(int x, int y)// 函数名定义不全部大写。
{
return ((x) > (y) ? (x) : (y));
}
#define ADD(x,y) ((x)>(y)? (x):(y)) //宏名定义要全部大写。
int main(void)
{
int a = 1;
int b = 2;
int add=Add(a, b);//函数调用和返回会有开销。
printf("%d \n", add);
int add2=ADD(a, b);//使用宏则在预处理阶段直接替换,没有函数调用和返回的开销,效率比较高。
printf("%d \n", add2);
return 0;
}
//用宏定义实现方便的malloc 函数内存的动态开辟。
#include<stdio.h>
#define MALLOC(num,type) (type*)malloc(num*sizeof(type))//宏定义的malloc 函数。
int main(void)
{
int* pm = (int*)malloc(10 * sizeof(int));
int a = 100;
int b = 200;
pm = &a;
int *pw=MALLOC(10, int);
pw = &b;
printf("%d \n", *pm);
printf("%d \n", *pw);
return 0;
}
宏定义相关知识点
最新推荐文章于 2022-03-26 16:56:11 发布