C语言宏替换的重复执行机制

这篇博客介绍了C语言中预定义宏__FILE__和__LINE__的用途,以及在使用中遇到的问题,如如何正确结合使用它们。通过解析ISO/IEC 9899:1999标准中的宏替换机制,提出了利用宏替换重复执行的特性来解决宏展开中字符串化的挑战,展示了宏#define stringify1(x) #x和#define stringify(x) stringify1(x)的解决方案。

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

ANSI C99标准中预定议了两个宏,__FILE__和__LINE__。这两个宏在断言中很有用
处。但是,这两个宏的类型却不相同:__FILE__展开为一个字符串,__LINE__ 展开为一个
整数。这也就意味着,你可以写出如下代码:

而以下代码却是非法的:

解决这个问题的第一个想法可能是使用“#”宏操作符:

但是这只能产生如下输出

 

 

ISO/IEC 9899:1999 中有这样一段话:

After all parameters in the replacement list have been substituted and # and ## processing has taken place, all placemarker preprocessing tokens are removed. Then, the resulting preprocessing token sequence is rescanned, along with all subsequent preprocessing tokens of the source file, for more macro names to replace.

 

在所有替换列表中的参数和#及##预处理操作符的置换工作都已经完成,所有占位符都已经被移除之后,其预处理结果将被重新扫描并进
行尽可能多的宏替换。

所以,针对上述问题,我们可以利用宏替换重复执行的特性来间接解决,方案如下:

其宏替换步骤如下:

其结果与以下调用等价:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值