问题标签 [x-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
138 浏览

c++ - 我的逗号在可变参数宏扩展中消失在哪里?

我正在为我的一个项目编写一个基于 x-macro 的寄存器文件布局描述系统。大多数时候,宏扩展为模板类的层次结构。但是,我还想要枚举所有寄存器,如下所示:

这工作得很好。但是,我还使用可变参数宏指定别名寄存器。由于没有简单的方法可以去除 __VA_ARGS__ 元素之间的逗号(我不知道,如果我错了,请纠正我),我写道:

现在,如果我写

RINT 宏中的逗号消失:

如果反过来,我直接使用 RALIAS_4 宏

我得到了我的期望:

我知道 GCC 将一些非标准的逗号剥离逻辑应用于可变参数宏,但是当我明确指定 -std=c++11 时不应该发生这种情况。此外,Clang 给了我完全相同的结果。然而,我在标准(草案)和 GCC 文档中都找不到任何可以解释这种行为的东西。

我错过了什么?

我在 Arch Linux (x86-64) 上尝试了 GCC 6.1.1 和 Clang 3.8.1。两个编译器都是从存储库安装的。

0 投票
1 回答
247 浏览

c++ - 使用 C++ 将 XMacro 结构打印到控制台

我正在玩结构体和类,我看到了我想尝试的一个非常酷的编码:x-macro。

我的代码分为 3 位,标题、x 宏和主 cpp 文件。该程序尚未完成,还有代码覆盖和抛光要做,但我正在尝试使用 x-macro 构建一个结构,然后我想将结构的内容打印到屏幕上。

这是我的 x 宏

这是我的标题(现在很贫瘠)

这是我的main()(我在这里剪掉了一堆代码。总而言之,我在这里所做的是构建一个具有不同属性的 Airplane 类。然后我构建了三个不同的子类,它们继承了 Airplane 的属性并做了自己的事情。所以除非你们认为我的问题出在那儿,否则我将完全避免发布课程。我要做的只是发布无法正常工作的功能...)

我以前从未使用过宏,这就是我现在尝试这样做的原因。但据我了解,预处理后的代码应如下所示:

我做错了什么让我无法获得上面的代码输出?

0 投票
1 回答
202 浏览

c - XMacro 中的结构

我正在尝试为 XMacro 表中的结构分配一个值。

有没有其他方法可以将“偏移量”分配给结构的这个值?

0 投票
0 回答
368 浏览

c++ - 一个 #macro 添加一个字段和一个案例(在 switch-case 中)

如何定义宏 ( ALL_SWITCH) 以将另一个宏 ( SINGLE_CASE) 的出现识别为列表,并将代码插入 2 个不同的位置?

可能吗?

例子

我想创建语法大致类似于以下内容的宏:-

以下是预期用途。

TopHeader.h :-

经理.h:-

这不是一个好的设计,但它是一个简单的例子来考虑是否MACRO可以做一些聚合

当我真的想要最终的性能和灵活性时,此功能很有用,
例如将索引存储到成员本身以获得极快的 hashMap

我读过了 :-

我不确定x-macros标签是否合适。
(我在这方面的知识有限。)

我的进步

我仍然不知道如何使它支持许多slot相同的类或代码ALL_SWITCH
我正在考虑在宏中定义某种表格,然后让其他宏读取它。(不可能?)

0 投票
1 回答
207 浏览

c - 是否可以(递归地)使用 x 宏“内省”嵌套的 C 结构?

我正在阅读这篇文章(通过(ab)使用预处理器进行的结构迭代),其中作者使用 x-macrosoffsetof并将元数据添加到结构中,这将允许其成员轻松序列化、按名称访问等。但它只是为原始结构元素实现。

是否可以将其扩展为包含嵌套结构的结构?即允许对以下内容进行简单的反序列化的东西:

我注意到作者在一开始就说明了这一点:

在这个阶段,结构仅由原始元素(int、float、char 等)组成。处理嵌套结构、联合、位域和指针需要额外的工作(这可能是未来帖子的主题)。

使用 C 预处理器可以实现这样的事情吗?

(澄清)

为了更清楚,我想看看是否有一种方法可以让我:

a) 定义struct, 和
b) 为文本序列化/反序列化创建元数据

如果可能的话,一步到位。

0 投票
1 回答
106 浏览

c++ - 创建宏以将令牌(参数)一一收集到列表中

我正在尝试创建一个宏来生成指向另一个类的实例的指针以表示方向关系。

在此处输入图像描述

上图是相关图。(在实际情况下,有 100 多个类。)
箭头(红色)是Right<>. 箭头尾(绿色)是Left<>。(以下片段)

上面的代码是否有可能像这样自动MACRO_CAT创建宏/ ?:-MACRO_DOG

这种骇人听闻的宏魔法对于维护具有终极性能的对象之间的关系非常有用。

我想X-macro是一个可能的解决方案,但我对此的经验相对较少。
我也读过:-

只是一个粗略的指南/想法表示赞赏。(不需要完整的代码,但我不介意)

编辑:在实际情况下,BIND分散在许多标题中。
这是一个#include流的例子(下#include上):- 在此处输入图像描述

0 投票
1 回答
100 浏览

c++ - 使用枚举来确定返回结果的类型(使用宏的黑客攻击)

我有许多类型的游戏对象在某些方面相关联。
所有关系都由 实现Map<K1,K2>

GameRelation这是方便所有关系查询的中心类:-(
只是一个示例,无需关注所有细节)

上面的宏扩展为:-

以下是它的使用方法(完整演示):-

经过一些测试,它工作得很好。每个人都对神奇的结果感到满意。

但是,我有意识地告诉我,这是一个 hack。
这对于内容辅助(例如智能感知)和自动重构也有点不利。
如果我将他们的实现迁移到..cpp

问题:

  • 有什么优雅(少黑客)的方式吗?它是什么?
    “否”可以是一个有效的答案。
  • 当我需要这种(奇怪的)功能时, X-MACRO是(专业的)方式吗?
0 投票
0 回答
57 浏览

c++ - c ++ 98中的名称和枚举的分层非矩形列表

我正在尝试组装枚举(索引)及其相应名称的分层列表,以便我可以按名称访问特定的列表或遍历所有枚举,具体取决于我所在的代码部分。列表将是常量一旦编译,但需要在代码中轻松更改。我正在使用 X 宏来简化这一点,但我有点坚持如何获得我想要的灵活性。也许我做错了。

这部分工作:

然后在 中main,我可以使用以下方式遍历组:

如果我按名称选择一个特定的组,我可以这样做:

我可以访问这样的特定项目:another::enum_Self::Altitude

问题是我无法遍历每个组,然后遍历该组中的每个项目。我试图创建一个结构数组,每个结构都包含一个enumconst char * const数组名称,但我不知道如何预先定义一个通用结构,然后用特定的值对其进行初始化。而且我不能从顶层做一个二维数组,因为不是每个组都有相同数量的项目。我也考虑过向量,但它们是动态的,这里的重点是这些东西一旦编译就根本不应该改变。我怀疑我只是以错误的方式思考问题......

0 投票
2 回答
864 浏览

c - 如何在没有 x 宏的情况下在 C 中获得类似反射的功能

与软件工程上关于轻松按需序列化各种结构内容的这个问题相关,我找到了一篇文章,它使用 x-macros 创建“开箱即用”结构序列化所需的结构元数据。我也看到过类似的“智能枚举”技术,但它归结为相同的原理,即获取枚举的字符串表示,或通过名称获取结构的字段值,或类似的东西。

然而,经验丰富的 C 程序员在 Stack Overflow 上表示应该避免使用 x 宏作为“最后的手段”:

我可能会找到更多相关的线程,但不幸的是我没有为它们添加书签,所以这只是一些 Google-fu。

也许正确的答案是Protocol Buffers之类的?但是为什么用不同的语言(.proto定义)创建结构定义,然后运行构建步骤来生成 C 文件比使用内置预处理器来做同样的事情更可取呢?问题是这些技术仍然不允许我按名称检索单个结构,我必须在两个项目之间共享相同的定义并保持它们同步。

所以问题是:如果 x-macros 是“最后的手段”,那么解决我的问题的方法(当从不同的设备请求时轻松序列化各种内部数据)将是“第一手段”,或者在诉诸宏地狱之前的任何方法?

0 投票
1 回答
72 浏览

c - 当宏位于结构数组中时,如何将宏的名称转换为文字字符串?

说我有以下

我想将宏的名称添加到 name 变量中,如下所示:

这显然行不通,因为它没有扩展。如何解决这个问题?