热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将宏扩展为无代码:“do{}while(0)”或“while(0){}”

在我的代码中,我使用了一个宏,它应该生成一个日志条目,或者它不应该根据一些编译标志:#ifdefSOMETHING

在我的代码中,我使用了一个宏,它应该生成一个日志条目,或者它不应该根据一些编译标志:

#ifdef SOMETHING
#define LOG(a) printf ("%s", a)
#else
#define LOG(a) while (0) {}
#endif

这段代码运行良好,但是当我查看 Internet 时,我只看到有人在使用

#define LOG(a) do {} while (0)

代替

#define LOG(a) while (0) {}

这两种方法等价吗?我应该更喜欢一个吗?

回答


do {} while (0)并且while (0) {}在所有上下文中都不是等价的,例如,在后一种情况下,宏的用户自然会在末尾添加一个语法上不必要的分号,以便:

if( error )
LOG( "ERROR") ;
else
{
...
}

将扩展为:

if( error )
while(0){} ;
else
{
...
}

由于只有 the是有条件的elseif因此将 the与 the分离而失败while(0){}

还应该注意的是,两者在语法上都不等同于具有类型的表达式 printf ("%s", a)int更好的定义是:

#ifdef SOMETHING
#define LOG(a) do{printf ("%s", a)} while(0)
#else
#define LOG(a) do{} while(0)
#endif

或者

#ifdef SOMETHING
#define LOG(a) printf ("%s", a)
#else
#define LOG(a) 0
#endif

因此,它LOG()可以在任何语句有效或表达式有效的地方使用。该表达的版本应该在可能被使用的表达式的值情况下使用。独立语句中表达式的扩展:

0 ;

是有效的 no-op 或 null 语句,但某些编译器或静态分析器可能会针对未使用的表达式发出警告。

常见的无操作习语,例如:

#define LOG(a)
#define LOG(a) ((void)0)

也可以考虑,但都缺乏与替代扩展的句法等效,因为一个扩展在另一个有效的所有上下文中都有效。





回答


他们的不同之处在于

do {} while (0)

语句末尾需要一个分号,而

while (0) {}

才不是。

所以,当你写

LOG ("Some textn");

第一个它扩展到

do {} while (0);

这是一个单一的语句,但第二个它扩展到

while (0) {};

这是两个陈述,thewhile (0) {}和 the ;(这是一个有效的陈述)。

当您将它与if. 我你写的东西是这样的:

if (1)
LOG ("Condition is truen");
else
LOG ("Condition is falsen");

通过这种while (0) {}方法,这扩展到

if (1)
while (0) {};
else
while (0) {};

这相当于

if (1)
while (0) {}
;
else
while (0) {}
;

这不会编译,因为有一个else没有相应的if.

因此,您应该更喜欢这种do {} while (0)方法以获得更大的兼容性。此外,它更地道。






推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有