C:执行 {...} while(0)? [复制]

2024-03-27

可能的重复:
为什么 C/C++ 宏中有时会出现无意义的 do/while 和 if/else 语句? https://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-do-while-and-if-else-statements-in-c-c-macr
do { ... } while (0) 它有什么好处? https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for

我正在编写一些充满如下宏的 C 代码:

#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)

谁能解释一下这个宏的作用以及原因do {} while(0)需要吗?那不是只执行一次代码吗?


do { stuff() } while(0);

正在做与 stuff() 完全相同的事情。那么有什么大不了的呢?问题在于宏的语法。假设我们定义宏如下:

#define SAFE_FREE(x) if ((x) != NULL) { free(x); x=NULL; }

那么,有两个问题。第一个相对较小:SAFE_FREE 的使用不再需要尾随分号。但更重要的是,代码如下:

if (...)
  SAFE_FREE(x)
else
   stuff();

将扩展到:

if (...)
  if ((x) != NULL) {
    free(x);
    x = NULL;
  } else
    stuff();

注意,如何else现在匹配错误if陈述。这完全改变了程序流程,尽管它在源代码中看起来并不像这样。

如上所述定义宏可以防止上面的奇怪行为,因为do { ... } while(0)其作用就像一个没有分号的语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C:执行 {...} while(0)? [复制] 的相关文章

随机推荐

  • 从 GitHub 上已删除的分支恢复作为拉取请求发送的提交

    我做了一件蠢事 I fork在 GitHub 上发布了一个存储库 我做了一些改变 commit把它们放在我的叉子上 我将此提交作为拉取请求回到原来的仓库 愚蠢的部分来了 我deleted 我的叉子 原始存储库的所有者要求在接受拉取请求之前对
  • 图例显示带有 geom_vline 的意外黑线

    在查看了 StackOverflow 上提供的一些答案后 我一直试图添加一个额外的图例 但不知何故我无法完成这项工作 我正在使用以下代码 x breaks lt seq as Date 2010 1 1 as Date 2015 4 1 m
  • 函数隐私和单元测试 Haskell

    你如何处理 Haskell 中的函数可见性和单元测试 如果导出模块中的每个函数以便单元测试可以访问它们 则可能会导致其他人调用不应出现在公共 API 中的函数 我想用 LANGUAGE CPP 然后围绕出口 ifdef LANGUAGE C
  • git svn:svn 的密码未存储

    我正在使用 git svn 对中央远程 svn 存储库使用 git SVN 存储库使用带有自签名证书的 https 一切正常 只有一个令人讨厌的例外 只要我直接使用 svn 密码就会被记住 所以只能在第一个命令中输入密码 当使用git sv
  • window.onload 与

    两者到底有什么区别window onload事件和onload事件的body标签 我什么时候使用哪个以及如何正确完成 window onload myOnloadFunc and 是不同的使用方式同一个事件 Using window onl
  • 如何使用 ScriptTags 为 shopify 开发 Rails 应用程序

    我在 Heroku 中部署了一个 Shopify 应用程序 并使用 Rails 开发 我需要从任何 Shopify 商店的前端调用 JavaScript 函数 我读过这篇文章 http www shopify com technology
  • Appcelerator Titanium:Facebook 图片上传失败

    我的 Titanium 软件中从 Facebook 上传图像时出现错误 每次我想从我的应用程序上传图像时 我都会收到以下信息 失败 v2 1 及更高版本已弃用 REST API 但如果我在 KitchenSink 示例应用程序中尝试相同的代
  • 在设计模式中编辑集合的最简单方法?

    最简单的编辑方法是什么persist像这样的集合decimal or List
  • 在 Python 上分析字符串输入直到达到某个字母

    我需要帮助来尝试编写程序的某个部分 这个想法是 一个人输入一堆乱码 程序会读取它 直到它到达 感叹号 例如 input Type something 人物类型 wolfdo65gtornado salmontiger223 如果我要求程序打
  • `enable_query_strings` 无法正常工作

    我正在尝试使用 CodeIgniter 和 xdebug 当我输入以下 URL 时 http localhost redux index php xdebug 运行良好 当我访问以下网址时 http localhost redux inde
  • QT后台进程进行键盘输入嗅探

    我正在开发一个简单的应用程序 该应用程序将在后台运行并捕获用户的键盘输入 如键盘记录器 但用于 LAN 我正在发送 UDP 数据包来传输击键 但从后台进程捕获键盘输入的问题似乎仍然无法解决 所以需要帮助 如果您想在 Windows 上执行此
  • 子类化 NSNumber

    我想向 NSNumber 类添加一个属性 因此我必须对其进行子类化 文档指出我必须重写所有 NSValue 原始方法 由于 NSValue 文档没有说明哪些方法是原始方法 所以我认为这两个可能是实例化的原始方法 initWithBytes
  • 将文本表转换为 pandas 数据框

    很多时候 当我尝试回答 Stackoverflow 上的问题时 问题包含一个表 我必须将其转换为 pandas 数据框才能进行处理 例如 在这个问题中 http stackoverflow com questions 43172116 pa
  • 使用验证器 jQuery 验证 Click 事件上的表单

    我正在使用 jQuery validate 来验证输入 我的代码 button click function form validate rules phone required true number true rangelength 7
  • 测试 Google Analytics iOS SDK

    有人找到了在 iOS 上测试 Google Analytics 的好方法吗 SDK 非常简单 但文档没有讨论如何测试或验证 该库在模拟器上或运行调试构建配置时的行为是否有所不同 我使用此委托方法设置了委托 GANTrackerDelegat
  • 紧凑框架中的网络浏览器

    我想用一个WebBrowser NET Compact Framework 3 5 项目中的组件 我面临着关于此的相互矛盾的信息 如果我只是尝试使用它 我会得到以下异常 System Threading ThreadStateExcepti
  • 椭圆弧箭头边缘d3力布局

    我正在使用强制布局来创建有向图 它渲染在画布上 我的示例位于http jsbin com vuyapibaqa 1 edit html 输出 http jsbin com vuyapibaqa 1 edit html output 现在我的
  • 无法在 DayNight 主题中动态切换模式

    我在我的应用程序中实现了 DayNight 主题 并添加了一个在白天和夜间模式之间切换的设置 但如果不重新启动 我无法在模式之间动态切换 如果我使用setDefaultNightMode 设置更改后 设置活动不会更改模式 但后台堆栈中的活动
  • VS Code 中的 SQL 调试

    我已经在 Windows 上安装了 VS code 工具并探索其功能 到目前为止 我想说它是一个很棒的工具 与传统的 SSMS 相比 它具有一些很酷的功能 我面临的困难是 在 VS Code 中使用 debug 当我单击调试时 它会在活动栏
  • C:执行 {...} while(0)? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 C C 宏中有时会出现无意义的 do while 和 if else 语句 https stackoverflow com questions 154136 why are there som