目录
1.#define的本质
#include <stdio.h>
// #define 定义标识符号
#define num 1000
int main()
{
int a = num;
return 0;
}
在vscode进行预编译处理,我们发现#define所定义的符号在,预编译之后,就被替换了。注释也删除了,这其实就是答案。
本质就是对这所定义的num进行替换。
2.#define的使用
#include <stdio.h>
#define add(x) x+x
int main()
{
printf("%d\n",2*add(10));
return 0;
}
去运行下代码块里面的代码,结果就会是30,参考预编译后的就会知道结果。
练习:不妨自己试一下以下代码
#include <stdio.h>
#define add(x,y) ((x)+(y))
int main()
{
int a = 0,b =1;
printf("%d\n",add(a++,b++));
return 0;
}
#include <stdio.h>
#define max(c,d) ((c)+(d))
int main()
{
int a = 0,b =1;
printf("%d\n",add(a++,b++));
return 0;
}
可以设置断点看一下每一个值得变化。下面是第二段代码得预编译结果
3.宏求偏移量以及一些小用法
struct S{
int a;
char b;
double c;
} s;
#define my_offset(A,B) ((size_t) & ((A*)0)->B)
int main()
{
int b = offsetof(struct S,b);
size_t c = my_offset(struct S,b);
printf("%d\n",b);
printf("%u\n",my_offset(struct S, c));
printf("%u\n",my_offset(struct S, b));
return 0;
}
求结构体偏移量,奇妙利用了0这个值,0地址开始得结构体编译,避免了减法得使用。
4.与函数对比。
函数 | #define | |
速度 | 较慢 | 快(预编译就处理了 |
调用 | 传值调用 | 直接替换 |
适用规模 | 可大可小 | 一般是小型问题 |
调试 | 可调式(观察值) | 无法调试 |
严格度 | 严格(有类型检查) | 相对宽松 |