宏定义浅谈(一)

本文深入探讨了C/C++中的宏定义,包括对象宏和函数宏的使用,强调了宏展开可能导致的问题及解决方案。通过实例解释了宏展开可能导致的错误,如多重展开和副作用,提出了解决这类问题的GNU C赋值扩展方法。此外,文章还展示了如何通过宏改进NSLog的使用,避免了可变参数宏的潜在问题,并分享了用于调试的实用宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宏的优点:

1、编译优化和方便。

2、极强以及跨平台能力。

3、漂亮的代码。


C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro)。


对象宏,对象宏一般用来定义一些常数。

例:

//This defines PI
#define M_PI        3.14159265358979323846264338327950288

#define关键字表明即将开始定义一个宏,紧接着的M_PI是宏的名字,空格之后的数字是内容。类似这样的#define X A的宏是比较简单的,在编译时编译器会在语义分析认定是宏后,将X替换为A,这个过程称为宏的展开。


函数宏,就是行为类似函数,可以接受参数的宏。具体来说,在定义的时候,如果我们在宏名字后面跟上一对括号的话,这个宏就变成了函数宏。

例:

//A simple function-like macro
#define SELF(x)      x
NSString *name = @"Macro Rookie";  
NSLog(@"Hello %@",SELF(name));  
//   => NSLog(@"Hello %@",name);
//   => Hello Macro Rookie

这个宏做的事情是,在编译时如果遇到SELF,并且后面带括号,并且括号中的参数个数与定义的相符,那么就将括号中的参数换到定义的内容里去,然后替换掉原来的内容。 具体到这段代码中,SELF接受了一个name,然后将整个SELF(name)用name替换掉。


多个参数的宏

例:

#define PLUS(x,y) x + y
printf("%d",PLUS(3,2));  
//  => printf("%d",3 + 2);
//  => 5

相比对象宏来说,函数宏要复杂一些。


实现一个函数宏

例:给定两个数字输入,将其替换为较小的那个数。

#define MIN(A,B) (A) < (B) ? (A) : (B)


那么问题来了,

例:

float a = 1.0f;  
float b = MIN(a++, 1.5f);  
printf("a=%f, b=%f",a,b);  
// => a=3.000000, b=2.000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值