问题标签 [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 回答
191 浏览

c++ - C ++ MACROS:条件代码包含在表达式NOT语句中

好的,我知道宏是邪恶的,应该不惜一切代价避免。我正在尝试减少重要的样板代码和重复,如果我不能将其宏化,就很难不犯错字。

这是一个有些人为的例子,因为我试图将我必须的真实代码简化为一个更简洁的例子。

这将正确扩展在 BINDIF 宏中找到的 std::bind 代码。但是,请注意第一个参数,即条件,设置为 1。如果我将此值更改为 0,它会正确地下降值 nullptr。问题是我希望在评估传递给 BINDIF 宏的“方法”参数时发生这种情况。我想在表中输入 nullptr 值,因此不会生成 std​​::bind 代码。

我完全知道这个例子看起来是多么做作,但是在我使用的实际代码中,大多数列都包含 nullptr,因为我稀疏地绑定到 4 个 std::function 指针之一。

这是1的扩展:

这是 0 的展开式:

请原谅任何错别字和这个问题的总长度。我在过去几天在这里和其他地方搜索了答案,但找不到任何似乎有效的东西。Boost 的宏文档非常少。

大声笑,当然。带有如下 nullptr 的表:

会产生如下代码:

0 投票
1 回答
510 浏览

c - X-macro 打破了 doxygen callgraph

我有 3 个文件:

测试.c

测试2.c

测试.x

我使用 doxygen 为这些函数创建调用图。这是我的预期:

  • 1级:
    • 引用 level2()、level3() 和 level4()。
  • 2级:
    • 参考 level3() 和 level4()。
    • 由 level1() 引用。
  • 3级:
    • 参考 level4()。
    • 由 level1() 和 level2() 引用。
  • 4级:
    • 由 level1()、level2() 和 level3() 引用。

但这是我得到的:

  • 1级:
    • 引用 level2()、level3() 和 level4()。
  • 2级:
    • 由 level1() 引用。
  • 3级:
    • 由 level1() 引用。
  • 4级:
    • 由 level1() 引用。

似乎 test.c 上的 X-macro 是罪魁祸首。我设法通过做两件事来使它工作(要么会做):

  1. 重命名test.x所以 doxygen 找不到它。它会显示警告,但调用图是正确的。
  2. 在末尾添加尾随换行符test.x。通常文件会在X(3).

问题:

如何在不编辑文件的情况下从 doxygen 中获得可靠的调用图?是否有我需要更改的设置或者这是一个简单的错误?

0 投票
2 回答
62 浏览

c - x-macro 条件错误 - 数字比较

我想为所有X(a, b)地方的 X-macro 生成编译时错误a > b

所以,产生错误X(30, 20)

这在C中可能吗?

编辑:示例用法 对我来说,左边的数字是一些大型结构的例如 sizeof,右边的数字是存储这个结构的固定空间。如果结构大于可用空间,我需要编译器生成错误。

0 投票
1 回答
59 浏览

macros - 预处理找到#define之间的最大值

我有两个头文件使用不同的值进行相同的定义:

在另一个文件中,我想定义limits.h #define MAX_NUM_OF_TREES 如何使用宏分配静态时间(预处理)的最大值?

0 投票
1 回答
258 浏览

c++ - 预处理器#include 指令和宏扩展

我有下面的代码。使用 #define LIST 指令时,doxygen 会为 Child_* 类生成文档。使用 #include 指令时,将忽略 Child_* 类的文档。

配置文件也在下面公开。

问题:我应该如何配置 doxygen 以便 #include 指令正常工作?

“List.txt”包含:

我的配置文件:

0 投票
1 回答
123 浏览

c-preprocessor - 如何减少 xmacro 表扩展中的参数数量

我一直在使用基于 xmacros 的表,如下所示:

我有比我展示的参数更多的表,但是,在许多情况下,我只将表扩展为 1 或 2。我使用它们来生成变量和枚举。例如:

有没有办法获取 TABLE_MACRO 并重新定义或更改它的扩展顺序以使其扩展为这个?

我的目标是简化表格,使用如下:

0 投票
1 回答
65 浏览

c - 使用 X 宏扩展时强制字符串和指针进入闪存

我以为我对 X-macros 理解得很好,但这真的难倒我。我定义了以下代码:

我希望字符串和指针进入闪存,但我最终得到的是 .rodata,其中指针和字符串在 C 启动代码期间被复制到 RAM。有没有办法在这里做我想做的事情(定义多个字符串并定义指向字符串的指针数组),以便它们留在闪存中并且在仍然使用 X 宏时不会复制到 RAM 中?谢谢,

0 投票
1 回答
632 浏览

c - 为 X 宏连接多个标记

我第一次尝试同时使用 X 宏和预处理器连接。

我已经阅读了很多关于 SO 与预处理器串联相关的其他问题,但我还无法理解它们或如何使这些问题适应我的用例。

项目列表是一堆 的 ID 号列表structs,如下所示:

我可以像这样声明结构:

现在我还想将每个结构的成员之一初始化为等于 ID 号,例如foo_n.id = n;. 通过使用以下方法,我已经能够实现第一个令牌连接:

但是我无法理解如何正确地进一步扩展这个想法,以便也替换分配的值。我试过了:

以及使用双重间接进行连接的各种尝试。但一直没有成功。上述尝试对 中的每个项目导致如下错误LIST_OF_ID_NUMS

我怎样才能最好地实现表格foo_n.id = n

0 投票
2 回答
418 浏览

c - 基于先前值的 X 宏枚举

我想用 X-Macro 生成一个枚举。枚举必须根据 prev 大小增加。

我有这个

并想生成这个

但这不起作用

这行得通,但我觉得它可以更容易

0 投票
1 回答
225 浏览

c - 带有连接参数的 X-Macro

我正在使用 X-Macro 使用以下代码创建枚举

我想更概括一下,这样 X-Macro 表只有四个参数。第一个参数是通用/基本名称,然后将其与附加参数连接。我已将宏定义如下,它试图完成刚刚显示的代码。

编译器向我提供以下错误消息:

错误:“(”标记之前的预期标识符

所以,看来我的问题出在“EXPAND_NAME(a, WA) = b”表达式上。我尝试了几种不同的方法,但到目前为止都没有。最后,理想情况下,我只想指定一次“WA”、“WB”和“WC”,而不是像这里的代码那样指定两次。

我确实找到了一个类似的问题,Concatenate multiple tokens for X macro,但如果可能的话,这不是我想做的。非常感谢对我做错的任何见解。谢谢。

编辑:更正了第一个 X-Macro 定义,因为它包含复制/粘贴错误