[c语言]预处理 #define

预处理

预定义符号

符号作用
_FILE_进行编译的源文件
_LINE_文件当前的行号
_DATE_文件被编译的日期
_TIME_文件被编译的时间
_STDC_如果编译器支持ANSI C,其值为1,否则未定义

例子🌰

1

#define

#define 定义标识符

语法:
    #define name stuff

例子🌰

#define MN 78
#define reg register //为register替换一个简短的名字

注意#define定义标识符的时候,最后不要加;

否则容易出现以下问题:

2

#define 定义宏

#define 具有类似函数的功能,可以把参数替换到文本中,这种实现通常称为宏或定义宏。

语法:
    #define name( parament-list ) stuff

parament-list中填写参数,用逗号隔开,与函数不同的是,不用写其类型。

注意:参数列表的左括号必须与name紧邻,不能有空格。否则参数列表也会被当成stuff

例子🌰

#define MAX(x, y) x > y ? x : y
int main()
{
	int a = 10;
	int b = 20;
	printf("%d", MAX(a, b));
	return 0;
}

#define的本质是替换,代码中的MAX(a, b)实际被替换成了a > b ? a : b


#define与typedef

例子🌰

#define type1 int*
typedef int* type2;
int main()
{
	type1 a, b;
	type2 c, d;
	return 0;
}

问:a b c d哪些不是指针变量?

答:b,因为#define本质是替换,相当于int* a, b其中b不是指针变量。


既然只是替换,那么可能出现以下问题

#define MUL(x, y) x * y
int main()
{
	printf("%d", MUL(2 + 3, 3 + 2));
	return 0;
}

可能我们本意上希望实现5 * 5,实际上替换后变成了2 + 3 * 3 + 2容易因为运算符优先级的问题造成混乱。

所以有必要为每个参数以及整体加上括号#define MUL(x, y) ((x) * (y))

总结与注意

  • 宏不能递归
  • 宏的执行速度较函数更快,因为函数调用需要时间。
  • 函数参数有类型检查,宏参数没有
  • 由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应尽量使用括号明确优先级

小题:

用尽可能少的代码实现将一个整数的二进制位的奇数位和偶数位交换。

答案:

#define SWAP(x) (((x) & 0x55555555) << 1 | ((x) & 0xaaaaaaaa) >> 1)

0x55555555就是二进制0101 0101 0101 0101 0101 0101 0101 0101和x按位与可以筛选出x的奇数位,同理,0xaaaaaaaa可以筛选出偶数位,分别左右移再按位或即可得到答案。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

世真

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值