问题标签 [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 投票
3 回答
7619 浏览

c - 我可以附加到预处理器宏吗?

标准 C 或 GNU 扩展中是否有任何方法可以将内容附加到宏定义中? 例如,给定一个定义为的宏,
#define List foo bar
我可以追加bas它以便List像我定义它一样扩展它
#define List foo bar bas吗?

我希望我能做这样的事情:

但我不知道如何定义Expand()宏,所以它会做我想做的事。

动机: 我正在与这些受歧视/标记的工会打交道:

我认为这是 X-macro 的好地方。如果我定义一个宏
#define quux_table X(foo) X(bar) X(bas)
,则可以这样定义枚举和结构,并且永远不会不同步:

当然,quux_*结构可能会不同步,所以我想做这样的事情,只是合法的:

(好吧,我真正想做的是,
member_struct(quux, foo) { int x; };
但我很清楚不能从宏中(重新)定义宏。)

无论如何,这是我的激励例子。有没有办法做到这一点?

Boost.Preprocessor 示例很好,如果您能告诉我如何使 X-macro 技术与该库一起工作。

0 投票
1 回答
989 浏览

boost-preprocessor - 带有 Boost.Preprocessor 的 X 宏?

将此与我关于附加到 CPP 宏的问题分开:

这里有没有人使用Boost.Preprocessor库的数据类型来实现 X 宏之类的东西?

0 投票
2 回答
520 浏览

c - 如何消除冗余宏参数

不久前,我为一个大型项目编写了一组X 宏。我需要维护字符串和枚举引用/哈希值/回调函数等的一致列表。这是函数回调的样子

它位于头文件中,允许我编写如下内容:

这样可以缩短处理程序。例如,加载带有上述标签的配置文件很简单:

我的问题是:我讨厌我必须在我的#define. 我希望能够写#define _cl_tags(_)而不是#define _cl_tags(x,_). 如您所见,x仅用于向下传递前缀(cl_tag)。但这是多余的,因为前缀是初始宏的参数。

如果我的预处理器首先扩展最外层的宏,那么解决这个问题会很容易。不幸的是,GCC 的预处理器在展开最外层的宏之前通过最内层的宏(即参数值)工作。

我正在使用 gcc 4.4.5


澄清 根据 C89(和 C99)标准,以下定义

随着调用

应该产生

  1. plus(plus(a,b),c)
  2. add(c,plus(a,b))
  3. ((c)+(plus(a,b))
  4. ((c)+(add(b,a))
  5. ((c)+(((b)+(a))))

gcc 4.4.5 给出

  1. plus(plus(a,b),c)
  2. plus(add(b,a),c)
  3. plus(((b)+(a)),c)
  4. add(c,((b)+(a)))
  5. ((c)+(((b)+(a))))
0 投票
7 回答
27815 浏览

c - X-Macros 的实际使用

我刚刚了解了X-Macros。您见过 X-Macros 的哪些实际用途?他们什么时候是适合这项工作的工具?

0 投票
2 回答
1132 浏览

c++ - 减少 C++(或 x-treme x-macros)中的代码重复

我正在使用 x-macros 来减少重复量和代码重复,同时为游戏Bitfighter实现 Lua 接口。以下代码工作正常:

到现在为止还挺好。

除了我在几十门课上做的事情基本相同。我真正想做的是在每个类中定义方法表(可以称为任何东西),然后定义两个可以像这样调用的宏:

避免上面所有在块 A 和 B 中重复的代码。显而易见的方法是使用嵌套宏,但不幸的是,这是非法的。

有没有更好的办法?


解决方案


当我发布这个问题时,我很确定答案将是“无法完成”。相反,我有两种方法,其中一种正是我正在寻找的。还对宏的陷阱(有很多)进行了很好的讨论,并提出了一些替代方法。我根据公认的答案开发的实现是干净且易于理解的,脏宏的东西很容易看不到。

在某处的隐蔽洞中:

在每个类文件中:

0 投票
1 回答
630 浏览

c++ - #include 在 x 宏中

我想编写一个生成一些代码的 x 宏。该代码依赖于几个标头,旨在在命名空间内生成。

问题是 xmacro 的包含被包含在调用者的命名空间中。有什么办法可以解决这个问题吗?

例子:

xmacro.hpp:

主.hpp:

0 投票
1 回答
958 浏览

c - 是否可以修改此 X-Macro 以构建包含数组的结构?如何?

在 SO 上找到了这个非常有用的 Q/A:有没有办法在 C 中循环使用具有不同类型元素的结构?

但是由于我对整个 X-Macro 的东西还很陌生,所以我想知道,是否以及如何将这个示例改编为带有数组的结构 - 如下所示:

这是要适应的:

我的出发点是这样的,但我很确定,格式必须是别的东西,或者必须被替换:

地址类似于 {0x10,0x12,0x0A} - 大小相同。

编辑:

这是我当前如何使用这个结构的一个例子,没有 x 宏:

0 投票
1 回答
5897 浏览

c - Stringifying an conditionally compiled enum in C

Our system has a large number of enums denoting stuff such as events, errors etc.

I'm trying to build infrastructure that would allow us to log each received event or error message as a string (instead of a plain integer), without having to build and maintain two lists for each enum.

I found the X Macro technique quite suitable for my needs. Thus, instead of doing this:

I'm doing this:

That's all good and well, but the thing is some of our enums are quite big, comprising hundreds of values and filled with conditional compilation, and look a bit more like this

As is turns out, C wouldn't allow conditional compilation within a macro. Eclipse claims "Invalid use of macro pasting in macro: SOME_ENUM, and when I try to build the code it fails due to "error: '#' is not followed by a macro parameter" (With the line number matching the first #if statement within the macro).

So now I'm quite stuck, and would appreciate any advice.

Is there a solution to my conundrum?

When suggesting a solution, please note that:

  • I can't have more than one list per enum
  • This solution needs to be applied to a large number of enums (i.e., I can't really put each enum in its own .h file)

Thanks.

0 投票
2 回答
570 浏览

c - 任何人都可以用示例代码解释 X 宏以使用它们吗?

我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位专家能用“如何使用,如何调用”的例子来解释这个话题,那就更好了。

我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我缺乏使用那些 X 宏的代码片段。

在此先感谢帕莎

0 投票
2 回答
573 浏览

c++ - C++ 宏中的函数式编程风格:这在任何地方都有记录吗?

阅读一些 C++ 代码时,我遇到了我称之为函数宏的“函数式”使用,大致如下(这是一个完全程式化的例子来说明这一点):

我对这门语言比较陌生,起初我无法弄清楚这一点,但后来我只通过预处理器 ( g++ -E) 运行它,你瞧,它解析为:

你看到它在那里做了什么吗?它将宏 NEXT_LEVEL像函数指针一样传递给宏 TOP_LEVEL。看到这可能有多么有用,我想了解更多关于它的信息:将函数传递给其他函数是非常复杂的东西,至少必须对这项技术多说些什么。

然而,尽管进行了大量的谷歌搜索,但我找不到任何证据证明预处理器的这个功能甚至存在,更不用说任何接近文档的东西了: herehereherehere只是跳过这个的宏教程的四个示例;最后一个甚至有一个名为“高级宏技巧”的部分 - 这肯定符合条件!?

(请注意,这与简单地以另一个评估的函数宏作为参数调用函数宏完全不同- FOO(BAR(2)) 更直接。)

我的问题是:

  • 这种行为有实际名称吗?
  • 它在任何地方都有记录吗?
  • 它是常用的,还是有众所周知的陷阱等?