可变参数宏和尾随逗号

2023-11-27

我正在尝试用 C 语言进行面向对象,并希望有一个用于表示法的语法糖宏

object->vtable->method(object, arg1, arg2)

into

send(object, method, arg1, arg2)

不幸的是,当一个方法不带参数时,就会出现尾随逗号问题

send(object, method)

gives

object->vtable->method(object, )

有没有portable (no ##__VA_ARGS__或 Visual Studio)这样做的方式?

我想出了一个,但我需要交换对象和方法

#define FIRST_ARG_(N, ...) N
#define FIRST_ARG(args) FIRST_ARG_(args)
#define send(msg, ...) \
 FIRST_ARG(__VA_ARGS__)->vtable->msg(__VA_ARGS__)

permits

send(method, object)
send(method, object, arg1, arg2)

Edit

在下面两个好的答案的帮助下,我将使用这些宏来完成此操作。它最多可处理 16 个参数,但可以轻松扩展

#define SEND_NO_ARG(obj, msg) obj->vtable->msg(obj)
#define SEND_ARG(obj, msg, ...) obj->vtable->msg(obj, __VA_ARGS__)

#define GET_18TH_ARG(arg1, arg2, arg3, arg4, arg5, \
    arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, \
    arg16, arg17, arg18, ...) arg18
#define SEND_MACRO_CHOOSER(...) \
    GET_18TH_ARG(__VA_ARGS__, \
            SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, \
            SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, \
            SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, SEND_ARG, \
            SEND_NO_ARG, )

#define SEND(...) SEND_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)

简短的回答是,是的,可以以便携式方式实现。

长答案:这很复杂,您可能不想自己实现。有多种方法可以计算宏接收的参数,然后根据该数字采取操作。P99实现了一系列可以帮助您实现这一目标的宏。如果您要实现两个基本宏send_2 and send_more对于这两种情况你可以实施send as

#define send(...)                     \
 P99_IF_LT(P99_NARG(__VA_ARGS__), 3)  \
 (send_2(__VA_ARGS__))                \
 (send_more(__VA_ARGS__))

从技术上讲,P99 中的这些构造有一个限制,即它们无法处理超过 150 个(左右)的参数send.

顺便说一句,你可能知道,调用宏send这确实不是一个好主意。通常人们更喜欢宏全部大写。而且大多数时候,最好有一个对您的库/包来说唯一的名称前缀,例如AC245_SEND.

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

可变参数宏和尾随逗号 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • 如何在保存记录之前清理数据(删除 html 标签)?

    我想知道 Rails3 是否有一种简单的方法可以在将输入数据保存到数据库之前从输入数据中删除 html 标签 现在 数据已由 HAML 在视图级别进行清理 JS 没有被执行之类的东西 但我想完全删除潜在的有害数据 基本上 我的问题是 是否有
  • 是否可以在 Gradle 中定义 Android 字符串数组资源?

    在 Android 版 Gradle 中 我试图生成与此字符串数组资源等效的内容
  • 来自扫描仪的 Java 循环/用户输入

    制作一个简单的篮球程序 我询问主队名称 本赛季有多少场比赛 然后循环询问下一场球队比赛 基本上 当我启动 do while 循环时 它效果很好 除非用户输入例如 俄亥俄州 例如 输出将从 剩余 6 场比赛 变为 剩余 4 场比赛 通常它会问
  • Pandas to_excel-如何让它更快

    我有一个包含 12 000 行和 34 列的数据框 pandas 将其写入 Excel 大约需要 15 秒 我读到了一些关于 to excel 函数的讨论 使其更快的一种方法是添加 engine xlsxwriter 我使用以下代码 wri
  • Facebook 新 iOS7 应用程序中的 UIStatusBar

    我有一个带有侧栏菜单的应用程序 有点像 Facebook 侧栏菜单 我正在使用这个名为SWRevealViewController而且效果很好 现在自从 iOS7 发布以来 我就是不知道如何调整我的状态和导航栏 就像在 Facebook 应
  • jQuery 验证插件条件必填字段

    我有一个问题jQuery 验证插件 我有一套3单选按钮 如果选择前两个中的任何一个 则会在表单上向用户显示额外的选择输入 如果选择第三个 则不会发生任何情况 我希望用户成为required如果他们从单选按钮集中选择选项 1 或 2 则可以从
  • 如何使用 SBT 运行 JUnit 4.11 测试用例?

    我有以下内容构建 sbt libraryDependencies com novocode junit interface 0 10 test libraryDependencies junit junit 4 11 test 我注意到ju
  • 具有缩放属性的 ObjectAnimator 使 bg 变黑?

    我使用 ObjectAnimator 来缩小relativelayout ObjectAnimator scaleDownX ObjectAnimator ofFloat view scaleX 0 5f ObjectAnimator sc
  • 隐藏滚动条并溢出:启用滚动

    我需要隐藏具有 Overflow scroll 的 div 上的滚动条启用后 div 将通过鼠标和键盘滚动 但滚动条本身不会显示 有没有办法用 css 来做到这一点 或者 javascript 是可行的方法 您可以使用纯 CSS 来做到这一
  • android:onClick 不适用于 ProGuard

    从今天开始 我的应用程序发生了一些奇怪的事情 每次我单击设置了 android onClick 属性的按钮时 我都会得到一个IllegalStateException 找不到方法 我注意到只有当我在文件中启用 Proguard 时才会发生这
  • Python pandas 从长转向宽

    我的数据目前采用长格式 下面是一个示例 Stock Date Time Price Year AAA 2001 01 05 15 20 09 2 380 2001 AAA 2002 02 23 10 13 24 2 440 2002 AAA
  • 支持通配符的 Python Windows 文件复制

    我一直在这样做 result subprocess call copy 123 xml out folder y if result 0 do something else do something else 直到今天我开始研究 pywin
  • 如何在 Java 中将数字格式化为固定长度、空格填充、千位分隔符、2 位小数

    如何在Java中将数字格式化为固定长度 在左侧字符串上填充空格 并用空格作为千 位分隔符 保留小数点后两位 假设是 14 个字符的字符串 I e Number 10 03 must be 10 03 and Number 1235353 9
  • R 脚本的 GUI 前端

    我们有一组 R 脚本 它们处理一些数据并产生一些结果 我们希望使这些脚本可供不习惯 R 命令行的基本用户使用 我们希望为他们提供一些漂亮的 GUI 这将允许 轻松从 MS Excel Access 导入 导出数据 如果可能 还支持复制 粘贴
  • 使用资产中的 Uri 或文件创建 MediaPlayer 时出错

    我将song mp3复制到项目的资产目录中并编写了以下代码 private MediaPlayer mp Uri uri Uri parse file android asset song mp3 mp MediaPlayer create
  • 具有应用内区域设置更改的 Android App Bundle

    当我需要从应用程序本身内部更改应用程序区域设置 即在应用程序内部进行语言更改设置 时 我遇到了 AAB 问题 问题是 AAB 只为我提供了我的设备语言资源 例如 我的设备安装了英语和法语 因此 AAb 只为我提供英语和法语的资源 但从应用程
  • Java ScheduledExecutorService BAD 精度

    您好 我编写了一个简单的程序来测试 ScheduledExecutorService schedule 函数的精度 该测试设置延迟并检查有效等待时间 该测试在运行 Linux 3 8 x86 64 的 i7 机器上执行 同时安装 OpenJ
  • 如何使用Java解码html代码? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 如何像 HttpUtility HtmlDecode 一样解码 Java 中的 HTML 字符实体 我需要提取段落 例如title在 StackOverflow 中 html file 我可
  • R 使用 %in% 从字符向量中删除停用词

    我有一个包含字符串的数据框 我想从中删除停用词 我试图避免使用tm打包 因为它是一个大数据集并且tm似乎跑得有点慢 我正在使用tm stopword字典 library plyr library tm stopWords lt stopwo
  • 可变参数宏和尾随逗号

    我正在尝试用 C 语言进行面向对象 并希望有一个用于表示法的语法糖宏 object gt vtable gt method object arg1 arg2 into send object method arg1 arg2 不幸的是 当一