可变递归预处理器宏 - 可能吗?

2023-12-08

我遇到了一些理论问题。在我维护的一段代码中有一组宏,例如

#define MAX_OF_2(a, b)       (a) > (b) ? (a) : (b)
#define MAX_OF_3(a, b, c)    MAX_OF_2(MAX_OF_2(a, b), c)
#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)
...etc up to MAX_OF_8

我想做的就是用这样的东西替换它们:

/* Base case #1, single input */
#define MAX_OF_N(x)      (x)

/* Base case #2, two inputs */
#define MAX_OF_N(x, y)   (x) > (y) ? (x) : (y)

/* Recursive definition, arbitrary number of inputs */
#define MAX_OF_N(x, ...) MAX_OF_N(x, MAX_OF_N(__VA_ARGS__))

...当然,这不是有效的预处理器代码。

忽略这种特殊情况可能应该使用函数而不是预处理器宏来解决,是否可以定义可变参数 MAX_OF_N() 宏?

为了清楚起见,最终结果应该是一个单独的宏,它采用任意数量的参数并计算其中最大的参数。我有一种奇怪的感觉,这应该是可能的,但我不知道如何实现。


可以编写一个计算其调用参数数量的宏。 (我找不到第一次看到它的链接。)因此,您可以编写 MAX_OF_N() ,它可以按照您的意愿工作,但您仍然需要所有编号的宏,直到达到某种限制:

#define MAX_OF_1(a)         (a)         
#define MAX_OF_2(a,b)       max(a, b)

#define MAX_OF_3(a,...)    MAX_OF_2(a,MAX_OF_2(__VA_ARGS__))
#define MAX_OF_4(a,...)    MAX_OF_2(a,MAX_OF_3(__VA_ARGS__))
#define MAX_OF_5(a,...)    MAX_OF_2(a,MAX_OF_4(__VA_ARGS__))
...
#define MAX_OF_64(a,...)   MAX_OF_2(a,MAX_OF_63(__VA_ARGS__))

// NUM_ARGS(...) evaluates to the literal number of the passed-in arguments.
#define _NUM_ARGS2(X,X64,X63,X62,X61,X60,X59,X58,X57,X56,X55,X54,X53,X52,X51,X50,X49,X48,X47,X46,X45,X44,X43,X42,X41,X40,X39,X38,X37,X36,X35,X34,X33,X32,X31,X30,X29,X28,X27,X26,X25,X24,X23,X22,X21,X20,X19,X18,X17,X16,X15,X14,X13,X12,X11,X10,X9,X8,X7,X6,X5,X4,X3,X2,X1,N,...) N
#define NUM_ARGS(...) _NUM_ARGS2(0, __VA_ARGS__ ,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)

#define _MAX_OF_N3(N, ...) MAX_OF_ ## N(__VA_ARGS__)
#define _MAX_OF_N2(N, ...) _MAX_OF_N3(N, __VA_ARGS__)
#define MAX_OF_N(...)      _MAX_OF_N2(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)

Now MAX_OF_N(a,b,c,d,e)将评估为max(a, max(b, max(c, max(d, e))))。 (我已经在 gcc 4.2.1 上进行了测试。)

请注意,基本情况(MAX_OF_2)在扩展中不会多次重复其参数(这就是为什么我把max在此示例中)。否则,您将在每个级别将扩展的长度加倍,因此您可以想象 64 个参数会发生什么:)

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

可变递归预处理器宏 - 可能吗? 的相关文章

  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 实现只有一个居民的类型的价值

    感谢 MilesSabin 的answer https stackoverflow com a 32157259 867671我可以编写类型级别的斐波那契序列 sealed trait Digit case object Zero exte
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 宏内调用函数和宏的区别?

    我的难题是以下示例 defmacro macro1 x println x defn func1 x println x defmacro macro2 x macro1 x func1 x defmacro macro3 x func1
  • 可扩展的宏定义

    灵感来自于评论区 https stackoverflow com questions 23879410 is it possible to extend a function lambda macro in scheme 23879575
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • XCode iPhone 项目中目标所有配置的通用预处理器宏

    我的应用程序的每个目标通常有四种配置 调试 发布 分发 临时 有没有办法为所有 4 个添加一个通用宏 同时不破坏我到目前为止设置的宏 您在编辑器中看到 多个值 提前致谢 奥比旺 在前缀头文件中定义宏 将包含在所有源文件中
  • 内联函数与预处理器宏

    内联函数与预处理器宏有何不同 预处理器宏只是应用于代码的替换模式 它们几乎可以在代码中的任何地方使用 因为在任何编译开始之前它们都会被替换为扩展 内联函数是实际函数 其主体直接注入到其调用站点中 它们只能在适合函数调用的地方使用 现在 就在
  • 如何有条件地更改 Rust 宏的一小部分?

    我正在建造一个具有以下功能的板条箱foo 这个箱子有一个宏bar 根据是否做细微不同的事情foo is set 我可以复制整个宏 cfg feature foo macro rules bar Lots of rules A gt B cf
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • Julia 中基准和时间宏的区别

    我最近发现两个宏之间存在巨大差异 benchmark 和 time 在内存分配信息和时间方面 例如 benchmark quadgk x gt x 0 1 BenchmarkTools Trial memory estimate 560 b
  • Objective C“#if”语法

    我对 如果 或 如果 有点困惑 if当我查看一些类时我看到的语法 例如 if someConstant someNumber do something elif etc versus if someConstant someNumber d
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • 其可变参数没有参数的可变宏

    调用可变参数宏是否合法M其可变参数没有参数 相关标准报价为 cpp 替换 4 如果宏定义中的标识符列表不以省略号结尾 则调用类似函数的宏中的参数数量 包括那些不包含预处理标记的参数 应等于宏定义中的参数数量 否则 调用中的参数数量应多于宏定
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • 具有多个以逗号分隔的值的宏实际上意味着什么?

    当我在招聘过程中尝试进行技术考试时 我遇到了一个包含宏的问题 如下所示 define random 2 4 这是什么意思 如何为单个宏定义两个带有逗号的值 它实际上取代了所有出现的token https en cppreference co

随机推荐

  • Python OpenCV 实时人脸检测裁剪保存

    我对此进行了大量的研究 我认为我的逻辑已经磨损了 几乎在那里 但似乎无法理解为什么 cv2 imshow 窗口中没有显示任何内容 只是一个灰色的框 但好消息是我是能够检测脸部并裁剪该脸部 然后将其保存在文件夹中 你能告诉我我哪里出了问题吗
  • 旋转和移动画布元素中的图像?

    我想在元素中移动和旋转球的图像 球的尺寸为 68x68 画布的尺寸为 300x200 球沿着 x 和 y 轴移动 当它撞到墙壁时翻转它的 x 和 y 速度 所有这些都有效 我只是不知道如何在运动的基础上进行旋转 我的draw 函数每30毫秒
  • 来自 glmer 的反向变换系数以及用于预测的缩放自变量

    我使用以下方法安装了混合模型lme4包裹 我用以下方法转换了自变量scale 拟合模型之前的函数 我现在想使用以下方式在图表上显示我的结果predict 所以我需要将预测数据恢复到原始规模 我该怎么做呢 简化示例 database lt m
  • 无法从 Linux 容器切换到 Windows 容器

    我最近从头开始重建我的电脑 我已经安装了 Windows 版 Docker 我无法从 Linux 容器切换到 Windows 容器 这是我得到的错误 Error response from daemon open pipe docker e
  • 如何打印完整的 NumPy 数组而不截断?

    当我打印 numpy 数组时 我得到一个截断的表示 但我想要完整的数组 gt gt gt numpy arange 10000 array 0 1 2 9997 9998 9999 gt gt gt numpy arange 10000 r
  • 如何计算具有指数的字符串

    Javax ScriptEngine 和 JEval 的工作原理类似 您输入一个字符串并将其发送给它进行评估 它会返回您的结果 在 ScriptEngine 中 在 JEval 中几乎相同 System out println engine
  • VSCode:快速切换flutter版本

    所以 我使用的是 flutter 2 2 3 版本 现在无法升级 但是 我的另一个项目需要更高的SDK 我知道 有FVM 但我发现了这个 如何在同一设备上针对不同项目使用两个版本的flutter 并引用文章 https dartcode o
  • c#: SetScrollPos (user32.dll)

    我想要 2 个 丰富的 文本框 bc 2k8 具有相同的滚动 所以当我滚动 tb1 时 tb2 滚动到相同的位置 我使用这个功能 DllImport user32 dll static extern int SetScrollPos Int
  • Go 中空接口的最佳实践?

    我正在学习空接口 我发现虽然在 Stackoverflow 上有很多关于空接口的含义及其工作方式的解释 但关于何时 为何使用它们 何时避免 考虑因素是什么以及如何使用它们的最佳实践信息却很少 选择使用它们的优点和缺点 在 Go 聊天室中 我
  • knit/rmarkdown/Latex:如何交叉引用图形和表格?

    我正在尝试交叉引用使用knitr rmarkdown 生成的PDF 中的图形和表格 关于 SO 和 tex stackexchange 有一些问题 here and here 例如 建议内联执行此操作的方法是添加 ref fig my fi
  • 将 _blank 添加到所有外部链接[重复]

    这个问题在这里已经有答案了 可能的重复 获取 A 元素的 href 属性 解析 href 标签中包含特定单词的所有链接 我使用以下函数将 blank 添加到我网站上的所有链接 function targetBlank text return
  • PHP 中的 curl_setopt() 中 RETURNTRANSFER 常量的用途

    我想了解 PHP 中curl 的工作细节 有什么用curl setopt ch curl returntransfer true 我搜索了很多网站但没有得到答案 那么请告诉我这个特殊的功能 为什么我们使用CURL RETURNTRANSFE
  • 重复的局部变量和变量无法解析

    我的 java 代码中出现了三个不同的错误 有什么帮助吗 错误一 重复的局部变量乘积 int product input nextInt 错误 2 productTotal 无法解析为变量 System out printf 10 2f n
  • setTimeout 存在字段更新的循环问题

    我正在尝试循环遍历计时器上的列表 当前为 1 秒 但我希望它更快 问题是当前值没有在视觉上更新 我不明白为什么 当我循环遍历时Firebug it works按预期但没有萤火虫它没有显示文本更改 它是否以某种方式跳过文本更新 我把定时器设置
  • 如何使用 xml starlet 插入实体

    我试图用包含 符号的文本替换属性值
  • iOS 中捆绑资源中的 Sqlite3

    您好 我计划从我的项目资源文件夹添加静态 SQLite3 但我不知道我是否正确执行 到目前为止 这是我的进展 创建 SQLite3 数据库SQLite 数据库浏览器 Copied Sqlite3 Database to my project
  • 经典 ASP、MySQL 或 ODBC UTF8 编码

    我有一个由 GoDaddy 托管的网站 包括后端的 MySQL 数据库 该网站是斯洛文尼亚网站 因此使用了特殊字符 该网站是用经典 ASP 构建的 我在 Notepad 中创建了所有页面 其中使用了 utf 8 编码 在每个页面的顶部 我还
  • 使用curl POST multipart/form-data 的正确方法是什么?

    我使用此语法来发布文件以及一些参数 curl v include form key1 value1 form upload localfilename URL 该文件大小约为 500K 首先 我看到发送端的内容长度为 254 之后服务器响应
  • 如何使用python下载谷歌云平台上文件夹内的文件?

    from google cloud import storage client storage Client bucket client get bucket bucket name blob bucket get blob path to
  • 可变递归预处理器宏 - 可能吗?

    我遇到了一些理论问题 在我维护的一段代码中有一组宏 例如 define MAX OF 2 a b a gt b a b define MAX OF 3 a b c MAX OF 2 MAX OF 2 a b c define MAX OF