将宏名称传递到 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 列表是否合法 的相关文章

  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 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