宏定义(#define)

宏定义:
无参宏 带参宏 字符串化操作符# 符号链接操作符##

#include"stdio.h"
//带参宏的定义
//#define 标识符(形参表) 形参表达式
#define MAX(a,b) ((a)>(b))?(a):(b)
//可以像函数一样使用 通过实参和形参传递数据
//+运算符的优先级高于比较运算符 所以(a)>(b)这个小括号可以不加
#define F(a) a*a

#define SUM(x) (x+SUM(x))
//函数和宏的区别:
//函数和宏是完全不一样的 函数要求实参与形参类型一致 而宏替换不需要 函数只有一个返回值 而宏替换可能有多个
//函数影响运行时间 而宏替换只影响编译时间

//为防止无限制递归展开,当宏调用自身时,不再继续展开
//若程序中有SUM(100) 则被展开为100+SUM(100)

//宏定义如果需要换行时 需要加“\”连接 例如:
#define MAX_S(x,y)({\
	const typedef(x)_x = (x); \
	const typedef(y)_y = (y); \
	(void)(&_x == &y); \
	_x > _y ? _x : _y; })

//有时可以直接使用宏实现类似于函数的功能
//例如
#define UPCASE(c) (((c)>='a'&&(c)<='z')?((c)+'A'-'a'):(c))
#define LOCASE(c) (((c)>='A'&&(c)<='Z')?((c)+'a'-'A'):(c))


//返回数组a元素的个数:
#define ARRAY_SIZE(a) (sizeof((a))/sizeof((a[0])))


#define SWAP(type,x,y) do{\
	type _y = y;\
	y = x;\
	x = _y;\
	}while (0)


#define ISZERO(e) do{\
	if (e){ fprintf(stderr, "Warning:"#e"\n"); ERROR = 1; }\
	else ERROR = 0;\
	}while (0)
int ERROR;


#define SUM(n1,n2) printf("x"#n1"+x"#n2"=%d",x##n1+x##n2);
//x##n1+x##n2被替换成表达式x1+x2,这可不是简单的字符替换 这个表达式可以计算得到结果 用%d格式输出
int main()
{
	printf("%d\n",MAX(1,3));
	printf("%d\n", F(4));

	//需要注意的是:
	//1.有些参数表达式必须加括号
	//2.宏名和括号之间不能加空格

	//F(5+6)并不是11的平方 而是5+6*5+6 结果为41
	//如果宏定义为
	//#define F(a) (a)*(a)

	printf("%d\n", MAX(1 + 3, 1 + 2));

	int arr[10] = { 0 };
	printf("%d\n", ARRAY_SIZE(arr));


	//演示“重载” 功能
	int a = 10, b = 20;
	double c = 3.14, d = 5.18;
	SWAP(int,a, b);
	printf("a=%d,b=%d\n", a, b);
	SWAP(double, c, d);
	printf("c=%.2lf,d=%.2lf\n", c, d);
	

	//演示字符串化操作符#
	int a = 10, b1 = 0, b2 = 5;
	ISZERO(b1 == 0);
	if (!ERROR)printf("%d\n", a / b1);
	ISZERO(b2 == 0);
	if (!ERROR)printf("%d\n", a / b2);
	//程序中#e被替换成主函数传递过去的表达式"b1==0"


	//符号链接操作符##
	int x1 = 10, x2 = 20;
	SUM(1, 2);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭就是我的姓i

你的鼓励是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值