循环遍历宏 Varargs 值

2023-12-20

如果我定义一些宏:

#define foo(args...) ({/*do something*/})

有没有某种方法可以真正循环args而不是将其传递给另一个函数?就像是

#define foo(args...) \
        { \
           for (int i = 0; i < sizeof(args); ++i) { \
             /*do something with args[i]*/ \
           } \
         }

不是我能想到的...

但是,如果您的应用程序正在处理数量可变的相同类型的参数,例如:

foo(0);
foo(10, 20, 30);
foo(1, 2, 3, 4, 5, 6, 7, 8, 9);

并且您不介意使用函数来提供帮助,那么可以采取一些有用的技巧。

这里的主要问题是,您不能直接将这些参数传递给 varargs 函数,因为该函数无法知道有多少个参数需要读取。还有那个问题can可以通过一些预处理器魔法来解决:

#include <stdio.h>
#include <stdarg.h>

#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)

/* C99-style: anonymous argument referenced by __VA_ARGS__, empty arg not OK */

# define N_ARGS(...) N_ARGS_HELPER1(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
# define N_ARGS_HELPER1(...) N_ARGS_HELPER2(__VA_ARGS__)
# define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, n, ...) n

# define foo(...) foo_helper(N_ARGS(__VA_ARGS__), __VA_ARGS__)

#elif defined(__GNUC__)

/* GCC-style: named argument, empty arg is OK */

# define N_ARGS(args...) N_ARGS_HELPER1(args, 9, 8, 7, 6, 5, 4, 3, 2, 1)
# define N_ARGS_HELPER1(args...) N_ARGS_HELPER2(args)
# define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, n, x...) n

# define foo(args...) foo_helper(N_ARGS(args), args)

#else

#error variadic macros for your compiler here

#endif

static inline void foo_helper(unsigned int n_args, ...)
{
  unsigned int i, arg;
  va_list ap;

  va_start(ap, n_args);
  printf("%u argument(s):\n", n_args);
  for (i = 0; i < n_args; i++) {
    arg = va_arg(ap, unsigned int);
    printf("  %u\n", arg);
  }
  va_end(ap);
}

int main(void)
{
  foo(0);
  foo(10, 20, 30);
  foo(1, 2, 3, 4, 5, 6, 7, 8, 9);
  return 0;
}

Output:

$ gcc -W -Wall -std=c99 -pedantic -o va_macro va_macro.c
$ ./va_macro
1 argument(s):
  0
3 argument(s):
  10
  20
  30
9 argument(s):
  1
  2
  3
  4
  5
  6
  7
  8
  9
$ 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环遍历宏 Varargs 值 的相关文章

  • 此 C++ 模板中的迭代器类型应该是什么?

    前一段时间在处理一些图形代码时 我使用整数作为底层坐标持有者编写了 Rect 和 Region 类 并且效果很好 Region 被实现为 STL 列表的简单类扩展 并且仅包含 矩形列表 现在我还需要使用双精度作为底层坐标持有者的相同类型的类
  • TestContext.DataRow["MyColumnName"] 的替代品是什么

    在 Net Core 单元测试项目中使用 MSTest 我正在尝试使用 csv 数据源来提供测试方法的数据 以前 我会在 Net Framework 测试项目中使用如下所示的内容 DataSource Microsoft VisualStu
  • 关于我的编译器中缺少 stdafx.h(Windows 上的 mingw32)

    我有一个简单的问题 我注意到我的编译器中没有 stdafx h Windows 上的 mingw32 我应该拥有它吗 或者也许有办法绕过它 谢谢阅读 编辑 好的 这是我取出 stdafx h 的所有包含内容后的当前构建日志 http pas
  • SQL Server CLR 与第 3 方 SDK 集成:缺少程序集 System.Drawing 时出错

    我正在开发一个解决方案 该解决方案将与第 3 方应用程序的 SDK 接口 并最终创建一个数据集以将数据迁移到我们的 SQL Server 2014 实例上的目标数据库中 该接口是通过 SQL Server CLR 存储过程实现的 在 C 端
  • 如何存储指向将 Callable 对象作为其参数之一的函数模板的指针

    考虑以下示例 template
  • iTextSharp 从一页模板高效批量生成 PDF

    我正在使用 ITextSharp 生成多页 PDF 每个页面都有相同的模板 问题是 PDF 的物理大小会随着模板的大小而增长 I HAVE to use 阿克罗菲尔德 我怎么能够reduce最终文件大小 这是 pdf 处理程序的代码片段 p
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • 将 0x1234 转换为 0x11223344

    如何高性能地将十六进制数0x1234扩展到0x11223344 unsigned int c 0x1234 b b c 0xff lt lt 4 c 0xf c 0xff0 lt lt 8 c 0xff00 lt lt 12 c 0xf00
  • 显示与 C# 生成的表单相邻的另一种表单

    如何产生一种新形式 例如Form2 from Form1 但要确保Form2毗邻于Form1 例如 就像是 button click handler method Form2 child new Form2 child Location n
  • C语言中的积分提升和平衡有什么区别?

    积分提升和平衡有什么区别 我们是否可以总结这两条规则 即在执行任何操作 逻辑运算符 除外 之前 任何类型都至少转换为 int 或 unsigned int 类型 如果任何操作数的类型为更大 则转换为更大的类型比整数 积分促销 是旧的C90术
  • 基本 WinForm KeyDown 事件处理

    我正在使用 WinForms 我已经为KeyDown主窗体的事件 从而调用按钮的Click事件处理程序 The Click调用的事件处理程序取决于按下的特定键 如果用户单击该按钮而不是使用该键 然后随后尝试使用该键 则该键 例如向下箭头 将
  • 在 C# 中使用正则表达式重复模式

    我有一串话 词黑暗王辉光我们结束你好再见低翼 我需要找到第一个单词的最后一个字母与以下单词的第一个字母匹配的单词 例如 worD Dark 我写了一个正则表达式 b w w W 1 w b 目前它成功找到连续 2 个单词 Regex Mat
  • 关于使用 Botframework v4 更改为新 LUIS 密钥的问题

    我在 Azure 中下载了 C 模板 它会自动创建并设置 LUIS 应用程序 但现在 LUIS 达到 1000 次调用并且现已过期 我使用创建了一个新密钥本指南 https learn microsoft com en us azure c
  • cudaMalloc使用向量>进行管理 > C++ - NVIDIA CUDA

    我正在通过 NVIDIA GeForce GT 650M GPU 为我创建的模拟实现多线程 为了确保一切正常工作 我创建了一些辅助代码来测试一切是否正常 在某一时刻 我需要更新变量向量 它们都可以单独更新 这是它的要点 device int
  • 有没有工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 由于堆问题 我一直遇到崩溃问题 所以我猜想某个地方发生了缓冲区溢出 我如何检测它 I use Compuware 边界检查器 http w
  • 关于捕获异常的良好实践

    我正在用 C 11 编写一个小程序 并且第一次真正使用异常 我有一个关于如何有效捕获异常的问题 经过一番谷歌搜索后我仍然没有答案 这是问题 通过 const 左值引用捕获异常还是通过 const 右值引用捕获异常 哪个更有效 或推荐 在代码
  • 使用 Elmah 进行异常处理

    我用 Elmah 记录异常 想知道我使用的技术是否是好的设计 现在 我捕获并重新抛出各种类和方法中发生的异常 并将它们记录到程序的主 try catch 块中的 Elmah 主程序 try Some code that fires off
  • 使用boost asio的线程池

    我正在尝试使用 boost asio 创建一个有限的线程池类 但我陷入了困境 有人可以帮助我吗 唯一的问题是我应该减少计数器的地方 代码无法按预期工作 问题是我不知道我的线程何时完成执行以及我如何知道它已返回池 include
  • 将 TableCell 文本转换为超链接

    我正在将 sql 查询中的数据提取到页面后面的 cs 代码中的 asp 表中 TableCell tCell1 new TableCell tCell1 Text myDataRow tid ToString 我想将其转换为超链接 我怎样才
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正

随机推荐

  • Hibernate / JPA -> 可空值和对象?

    我的基本问题是 如何强制 Hibernate 使 float 可空并分别接受 float datetime blob 的 NULL 我真正的意思是 NULL 而不是 浮动 0 0 更糟糕的是 当我尝试存储一个对象 其中所需的 NULLabl
  • 单击鼠标而不移动光标?

    我似乎找不到这个问题的具体答案 如何在不移动光标的情况下单击屏幕上的坐标 我正在开发一个项目 该项目将自动安装程序 但仍然希望在安装过程中控制鼠标来执行其他任务 有任何想法吗 一些例子也很棒 感谢那些试图帮助我的人 经过进一步研究 我找到了
  • 是否可以在 Glassfish 中进行干净的取消部署?

    我意识到任何使用 hibernate 的应用程序都无法在 Glassfish 2 1 1 中完全取消部署 许多类在取消部署过程后仍保留在内存中 您可以使用 jmap 和 jhat 检查它 我做了几次测试 发现只有具有休眠功能的应用程序才无法
  • 使用 monit 监控多个延迟工作的工人

    我读过很多关于使用 monit 监控delayed job 的内容 实施非常简单直接 但是 当 1 个工作线程不够时 我如何设置 monit 来确保 10 个工作线程持续运行 您可以将第一个工作人员的相同配置复制 N 次 假设您有 5 个工
  • 具有多个位置指令和子域的 nginx

    我正在尝试在 nginxconf 中实现类似的东西 子域 sub domain com gt 提供 html sub domain com api gt 代理到端口 3001 sub domain com viewer gt 提供另一个 h
  • Pycharm:如何为外部对象类型设置自定义字符串函数(即类型渲染器)?

    是否可以配置 PyCharm 使用自定义函数来显示 str 调试会话中类型的表示 我指的是内置类型或从第三方库导入的类型 我不想修改它们 例如 而不是调试器中的字符串 lxml html HtmlElement
  • 使用 npm 请求通过 JSON 进行 POST

    如何使用requestnpm 模块 curl https todoist com oauth access token d client id 0123456789abcdef d client secret secret d code a
  • 如何在 R 中运行 shell 脚本并将输出放入表中?

    我知道要运行 shell 脚本R正在使用系统命令 my table lt system command intern TRUE 但是 如果我的 命令 的结果是打印出一个表 并且我希望 R 将该表直接读入它自己的数据结构中 类似于数据框 有没
  • Maven:在生命周期中跳过测试编译?

    我有一个项目 我设置用test jar和普通 jar 通过使用此设置
  • Netbeans 从现有源创建/导入 cordova 项目

    Netbeans 从现有源创建 导入 cordova 项目 我有 netbeans 8 0 现在从命令行创建了 Cordova 项目 我想在 Netbeans 中打开这个项目 但我没有看到任何导入选项 现有源代码并从源代码创建 cordov
  • MVC 拦截器 vs Spring 安全过滤器 vs 其他东西......?

    我在我的 Web 应用程序中使用 Spring MVC 和 Spring Security 它包括用户注册页面和私人用户面板 我目前已使用以下 URL 模式对其进行设置 whatever myapp login用户登录 whatever m
  • 检查项目是否在列表中 (Lisp)

    检查某个项目是否在列表中的简单方法是什么 就像是 in item list 可能会回来true if item 1 and list 5 9 1 2 and false if item 7 通用语言 FIND这不是一个好主意 gt find
  • Docker 容器内的 root 密码

    我正在使用一个 Docker 映像 该映像是使用 USER 命令构建的 以使用名为的非 root 用户dev 在容器内 我是 dev 但我想编辑 etc hosts file 所以我需要成为root 我正在尝试 su 命令 但系统要求我输入
  • newInstance() 的 InstantiationException [重复]

    这个问题在这里已经有答案了 以下工作正常时className is java awt Rectangle and java lang String 等等 但它失败了 java lang Integer java lang Double gi
  • 使用 Rails 即时生成唯一令牌

    我想在控制器中为 user info token 列中的用户生成令牌 但是 我想检查当前没有用户拥有该令牌 这段代码足够吗 begin new token SecureRandom urlsafe base64 user User find
  • 帮助进行简单的 SQL 查询

    Table A Id Name 1 Apple 2 Mango Table B Id Locale Name In Lang 1 es ES Apple Spanish 1 it IT Apple Italian 2 it IT Mango
  • 如何首先在 EF 4.1 代码中映射父列

    在我的项目中 我有以下 DomainModel public class Login public Guid Id get set public Login CreatedBy get set 我正在使用流畅的配置 如下所示 modelBu
  • 翻转视图动画不起作用

    我正在开发一个 iPad 应用程序 它在视图中向用户提出问题 当他们回答问题时 我希望视图转换到包含下一个问题的另一个视图 为了使它看起来很奇特 我试图向它添加一个卷曲过渡 但我编写的代码不起作用 我看不到找到问题 它确实显示了正确的视图
  • 自动处理供应商前缀的 CSS 框架?

    我查看了 Blueprint Less 和 SCSS 但它们似乎都没有达到我想要的效果 我觉得这很难相信 因为处理供应商前缀是编写 CSS 中最令人沮丧的部分 因此这似乎是任何编写 CSS 框架的人应该解决的第一个问题 我想知道 是否有一个
  • 循环遍历宏 Varargs 值

    如果我定义一些宏 define foo args do something 有没有某种方法可以真正循环args而不是将其传递给另一个函数 就像是 define foo args for int i 0 i lt sizeof args i