将宏名称传递到 X-Macro 列表是否合法

2023-11-24

我想到以下是更好的风格X-macro trick:

#define LIST_OF_COLOURS(X) \
    X(RED) \
    X(GREEN) \
    X(BLUE)

#define LIST_OF_FRUIT(X) \
    X(APPLE) \
    X(ORANGE) \
    X(TOMATO)

具体来说,通过X宏添加到列表中,而不是在每次实例化列表时取消定义并重新定义它。这允许:

#define X_LIST(x) x,
#define X_STRING_LIST(x) #x,
#define COMPREHENSIVE_SETUP(n, l)  \
    enum n { l(X_LIST) };  \
    char const* n##Names[] = { l(X_STRING_LIST) };

COMPREHENSIVE_SETUP(Colour, LIST_OF_COLOURS)
COMPREHENSIVE_SETUP(Fruit, LIST_OF_FRUIT)

但问题是,我并不经常在野外看到这个习语,而且它也不是维基百科所描述的,尽管每当我尝试它时它“似乎有效”并且感觉更方便。

我的问题是,这实际上是合法且完全定义的,还是我依赖​​于未定义的行为?


是的,这是有效的。 C 标准中描述了宏等函数的预处理:§6.10.3 宏替换。相关部分如下:

¶10...后面跟着类似函数的宏名称的每个后续实例 由一个(作为下一个预处理标记引入的序列 预处理标记,该标记被替换列表中的替换 定义(宏的调用)......

6.10.3.1 参数替换

¶1在调用类函数宏的参数之后 已经确定,参数替换就发生了。一个参数 在替换列表中,除非前面有 # 或 ## 预处理 标记或后跟 ## 预处理标记(见下文)将被替换 在其中包含的所有宏都具有相应的参数之后 已扩大。在被替换之前,每个参数的预处理 标记完全被宏替换,就好像它们构成了其余部分一样 预处理文件;没有其他可用的预处理标记。

6.10.3.4 重新扫描和进一步更换

¶1替换列表中的所有参数都被替换后 并且 # 和 ## 处理已发生,所有地标预处理 令牌被删除。得到的预处理标记序列是 重新扫描,以及所有后续的预处理标记 源文件,用于替换更多宏名称。

除了节名称和编号之外,C++ 标准中也存在相同的措辞。

所以当你插上电源时X_LIST中,预处理器将替换X尝试扩展后通过它X_LIST就好像它是一个像宏一样的对象。既然不是,则留下的标记为X is X_LIST.

然后预处理器再次扫描该行。这次X_LIST随后将是(,因此将被扩展now.

将像宏名称这样的函数传递给“高阶函数”并非闻所未闻。这Boost.预处理器图书馆大量使用这个惯用语。

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

将宏名称传递到 X-Macro 列表是否合法 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • PHPExcel 合并单元格上的行自动高度/换行文本

    有没有在 PHP Excel 中设置行自动高度的好方法 到目前为止 我已经看到您可以使用固定高度 您可以预先指定您想要的行的高度 我还发现 如果您不使用合并单元格 则可以使用自动高度 PHPExcel 合并单元格的动态行高 如何在phpex
  • 修复生成条形码时“GDI+ 中发生一般错误”的问题

    我正在用 C 编写一个条形码生成器 我可以将条形码生成为位图 并可以在 Picturebox WindowsForms 中显示它们 另一方面 我无法将条形码保存为 gif 或 jpeg 文件 我的条形码是位图文件 这是我的代码 Bitmap
  • Safari/Chrome 开发者工具调试 CSS 覆盖

    Safari Chrome 开发者工具通过删除 CSS 规则来指示 CSS 规则被其他内容覆盖 如图所示 有时我发现自己无法从 CSS 文件中找出导致该规则被忽略的原因 但 Safari 本身肯定会在它击穿它时知道这一点 有没有办法知道什么
  • 客户端 (JS) 和服务器 (PHP) 中的 AES 256

    我尝试使用相同类型的操作 即 AES 256 在服务器端和客户端上加密和解密数据 在服务器上我使用 PHP 客户端我使用 CryptoJS 到目前为止我只能在服务器上加密和解密客户端 请参阅代码 JS
  • R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库

    我正在尝试使用 R 从内部连接到远程 PostgreSQL 数据库RPostgreSQL包 并且我收到似乎与连接的 SSL 设置相关的错误 我已经验证我可以使用命令行进行连接psql 所以我知道连接是有效的并且可以从我的计算机访问 我在 R
  • 尝试运行 flutter 应用程序时“无法连接到lockdownd”

    我正在关注开始使用教程 我可以安装一切 flutter doctor返回所有复选标记 但最后有一条消息 idevice id 返回错误 错误 无法连接到lockdownd 错误代码 2 如果我尝试使用运行该应用程序 则会出现相同的消息flu
  • 我可以像其他库一样将 JointJS 作为 AngularJS 模块注入吗?

    我有一个带有角度的应用程序 我需要使用这个库http www jointjs com 所以我下载了 joint min js 和 joint min css 并将它们的路由放在 index html 中 但我不知道在 app js 中放入什
  • SQL 选择特定行周围的“窗口”

    以前很可能已经问过这样的问题 但我想不出要搜索的术语 我正在开发一个照片库应用程序 想要显示 9 个缩略图 显示当前显示的照片的上下文 在 3x3 网格中 当前照片位于中心 除非当前照片位于显示的前 4 张照片中 在这种情况下 例如 如果当
  • PHP 函数调用位置

    考虑这个片段 function f return hi echo f 对比这个片段 echo f function f return hi 当我运行脚本时 它们都会产生相同的结果 那太棒了 但我的问题是 我在任何搜索中都找不到好的答案或参考
  • 为什么以及在什么意义上 pthread_t 是一个不透明类型?

    SO 上的帖子表明pthread t是一个不透明类型 不是数字 当然也不是线程索引 您不应该直接比较pthread t的等等等等 问题 为什么 是否真的有意支持没有线程数字 ID 的系统 当 的时候pthread t实施很简单 typede
  • NInject 可以按需加载模块/组件吗?

    NInject 中是否有设施允许我像在 Unity 中一样按需从其他模块 程序集 加载服务 我很确定这就是您正在寻找的 var kernel new StandardKernel kernel Load Assembly Load your
  • Android:活动开始时明确聚焦于编辑文本

    我的应用程序中有一些设置页面 一旦活动直接开始 它就会集中到编辑文本 我使用以下代码来清除焦点
  • 如何摆脱 StyleCop

    我们团队中的某人安装了 StyleCop 从那时起 除非安装了 stylecop 否则他加载并致力于源代码控制的所有项目都拒绝加载 我知道我可以手动编辑 csproj 文件来删除它 但是有没有一种简单的方法可以自动从项目文件中删除这些 st
  • 如何在flutter中覆盖其他应用程序?

    我想要即使我的 flutter 应用程序已关闭 也会显示警报框或弹出警报框 类似于这张图片 你可以检查这个插件系统警报窗口 一个 flutter 插件 用于在所有其他应用程序上显示 Truecaller 之类的覆盖窗口以及回调事件
  • PostgreSQL - 从数据库转储恢复一张表

    如何从数据库转储中恢复一张表 我使用下一个命令进行转储 pg dump U admin h localhost my db name gzip gt home a2 db backup my db name backup sql gz 没有
  • 使用 Delayed::Job 管理多个作业队列

    我想使用 Delayed Job 或者可能是更适合我的问题的作业队列 将作业分派到多个后台守护程序 我有几个执行不同职责的后台守护进程 每个人都对 Rails 应用程序队列中的不同作业感兴趣 使用 Delayed Job 是否可以做到这一点
  • C# - 提取图像时解析 ffmpeg 标准输出

    我通过从我的 C 代码启动 ffmpeg 进程来提取单个视频帧 默认行为是将这些图像写入磁盘 然而 为了加快处理速度 我想重定向 ffmpeg 标准输出以接收流并在我的程序中进一步处理它 我正在使用与此类似的参数 i Filename vf
  • JQueryUI 可排序的 thead 和 tbody 在拖动隐藏两个字段的行时收缩

    我有一个包含不同行和字段的表 在一行中我有两个字段display none 当我拖动这些行时 会产生类似于横向填充的效果 tbody 和 thead 表格没有缩小 表格的元素是缩小的 在下一个 JsFiddle 中 第一行无法正常工作 但在
  • 检查年份是否为闰年

  • 将宏名称传递到 X-Macro 列表是否合法

    我想到以下是更好的风格X macro trick define LIST OF COLOURS X X RED X GREEN X BLUE define LIST OF FRUIT X X APPLE X ORANGE X TOMATO