#define定义标识符详解

本文介绍了#define在C语言中的作用,包括它的本质——预编译时文本替换,以及它的常见使用,如定义常量和简单的计算操作。讨论了宏求偏移量的技巧,用于获取结构体成员的内存位置。同时,文章对比了#define与函数在效率、调试和类型检查方面的差异。
摘要由CSDN通过智能技术生成

目录

1.#define的本质

2.#define的使用

 3.宏求偏移量以及一些小用法

4.与函数得对比。


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
速度较慢快(预编译就处理了
调用传值调用直接替换
适用规模可大可小一般是小型问题
调试可调式(观察值)无法调试
严格度严格(有类型检查)相对宽松

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值