为什么在宏定义中使用 do { } while (0) ? [复制]

2024-02-14

可能的重复:
为什么 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-mac

我遇到如下代码:

#define ev_io_init(ev,cb,fd,events) \
do { \
  ev_init ((ev), (cb)); \
  ev_io_set ((ev),(fd),(events)); \
} while (0)

我想知道作者为什么用do { } while (0)这里。 这有什么区别吗?

#define ev_io_init(ev,cb,fd,events) { \
  ev_init ((ev), (cb)); \
  ev_io_set ((ev),(fd),(events)); \
}

顺便说一句:代码来自 libev, ev_local.h


考虑if( something ) function1(); else function2();

If function1()实际上是一个宏,只是使用{ }要求您在使用时省略分号,但是do { } while(0)让您可以使用与实际函数完全相同的语法。

(根本不使用任何类型的块构造只会生成完全损坏的代码,当然)

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

为什么在宏定义中使用 do { } while (0) ? [复制] 的相关文章

  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 为什么我的图像旋转算法不起作用?

    尝试 1 和 2 Note 删除了减少问题大小的首次尝试 请参阅社区 wiki 了解之前的尝试 尝试3 根据 fuzzy waffle 的示例 我已经实现了以下内容 但它似乎无法正常工作 有什么想法我可能做错了什么吗 ImageMatrix
  • Selenium 在 JS 中使用 async/await,查找并单击元素

    我正在尝试使用 Selenium webdriver 和 Mocha 将我的测试重构为具有异步 等待功能的 ES7 我有以下代码 await loginPage loginAsAdmin THIS DOES NOT WORK await l
  • 多数据库应用程序的访问控制

    我有一个 mainDB nsf 其中包含所有 XPage 设计 代理 脚本库等 用户从该数据库中选择一个应用程序 可能存在一个或多个应用数据库 每个应用程序数据库都包含应用程序的实际数据 以及在 mainDB 中的自定义控件中访问的数据的视
  • 如何使用请求的第一个字母使用 .htaccess 重写缓存子目录?

    我有一个缓存程序 可以创建动态生成的 php 文件的静态 html 文件 我目前使用 php 来检查缓存版本是否存在 如果存在 我将其提供并退出 正如在这个问题 http stackoverflow com questions 561273
  • 如何在sklearn中实现n次重复的k折交叉验证以产生n*k折?

    I got some trouble in implementing a cross validation setting that i saw in a paper Basically it is explained in this at
  • 如何将 webpack 与 create-react-app 一起使用?

    我创建了一个创建反应应用程序 https github com facebook create react app项目遵循create react app 提供的文档 https facebook github io create reac
  • 彩色变音符号和 unicode 行为

    我只是偶然发现这个关于着色变音符号的问题 https stackoverflow com questions 23537441 how to display accents over words with different colors
  • 如何备份/移动 LXC 容器?

    我想要 lxc 容器备份 我们有服务器12 04 LTS ubuntu server我已经安装了LXC 1 0 0 alpha2在里面 我想将我们的 ubuntu 服务器更新到 14 04 LTS 所以我想做的是备份 LXC 容器 gt 将
  • Java/Swing 中的翻书

    你们都看过那些基于 Flash 的翻页书 我想用 Java 创建同样的东西 我使用 JTextArea 作为书的叶子 我想知道的是如何通过重写与 Mouse KeyListener 相结合的 componentPaint 方法来实现翻页效果
  • Perl的@INC是如何构造的? (又名影响 Perl 模块搜索位置的所有方法是什么?)

    影响 Perl 模块搜索位置的方式有哪些 或者 Perl的 INC是如何构造的 据我们所知 Perl 使用 INC包含目录名称的数组 用于确定在哪里搜索 Perl 模块文件 https stackoverflow com questions
  • 如何有条件地将服务注入组件?

    我有2个服务one service ts and two service ts 和一个组件dashboard component ts 如何有条件地将这些服务注入到组件中 import Component ViewEncapsulation
  • Linq VAR 和类型化对象

    我想要一个代码示例 目前我在 c 和 asp net 4 ef4 中使用 linq var querySlotOrder from slot in context CmsSlots where slot SlotId myCurrentSl
  • Sublime Text 的缩进错误

    我正在尝试使用 Sublime Text 3 for HTML 中的自动缩进功能 我在 html 中有一些块注释 选择 编辑 gt 行 gt 重新缩进 可以正常工作 直到遇到块注释 尝试重新缩进此处的示例 table tr td Cell
  • imagecreatefromjpeg 和类似的函数在 PHP 中不起作用

    我已经搜索过了 过去的问题中提供的解决方案对我来说完全无法理解 每当我运行类似的函数时imagecreatefromjpeg 我明白了 致命错误 调用未定义的函数 imagecreatefromjpeg 我正在安装新的 PHP 我上次安装从
  • 异步和等待 - 如何维护执行顺序?

    我实际上正在阅读一些有关任务并行库以及使用 async 和 wait 进行异步编程的主题 C 5 0 in a Nutshell 一书指出 当使用await关键字等待表达式时 编译器会将代码转换为如下所示 var awaiter expre
  • dplyr:按组查找每个 bin 的平均值

    我正在尝试理解 dplyr 我按组 箱和符号拆分数据框中的值 并且尝试获取每个组 箱 符号组合的平均值 我想输出一个数据框 其中包含每个组 箱 符号组合的这些计数以及每个组的总数 我想我有它 但有时与 ddplyr 的输出相比 我在基本 R
  • 在 Oracle PL/SQL 中,有什么方法可以导入包及其成员吗?

    给定一个包 create or replace package foo as f1 number 1 end 代替 declare begin dbms output put line f1 foo f1 end 我想写 declare b
  • 由于 DelegateCommand 而导致 WPF 应用程序内存泄漏

    我刚刚使用 MVVM 模式完成了用 WPF 和 C 编写的桌面应用程序 在此应用程序中 我使用 Delegate Command 实现来包装 ModelView 中公开的 ICommands 属性 问题是这些 DelegateCommand
  • Firebase 身份验证和数据库[重复]

    这个问题在这里已经有答案了 我对 Firebase 有疑问 我是新手 我想在登录时返回用户名 但该名称在数据库中 我只想返回名称 当然 与身份验证中找到的电子邮件一致 该电子邮件也在数据库中 我的想法是将数据库中的电子邮件与身份验证进行比较
  • 为什么在宏定义中使用 do { } while (0) ? [复制]

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