问题标签 [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.
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 技术与该库一起工作。
boost-preprocessor - 带有 Boost.Preprocessor 的 X 宏?
将此与我关于附加到 CPP 宏的问题分开:
这里有没有人使用Boost.Preprocessor库的数据类型来实现 X 宏之类的东西?
c - 如何消除冗余宏参数
不久前,我为一个大型项目编写了一组X 宏。我需要维护字符串和枚举引用/哈希值/回调函数等的一致列表。这是函数回调的样子
它位于头文件中,允许我编写如下内容:
这样可以缩短处理程序。例如,加载带有上述标签的配置文件很简单:
我的问题是:我讨厌我必须在我的#define
. 我希望能够写#define _cl_tags(_)
而不是#define _cl_tags(x,_)
. 如您所见,x
仅用于向下传递前缀(cl_tag)。但这是多余的,因为前缀是初始宏的参数。
如果我的预处理器首先扩展最外层的宏,那么解决这个问题会很容易。不幸的是,GCC 的预处理器在展开最外层的宏之前通过最内层的宏(即参数值)工作。
我正在使用 gcc 4.4.5
澄清 根据 C89(和 C99)标准,以下定义
随着调用
应该产生
plus(plus(a,b),c)
add(c,plus(a,b))
((c)+(plus(a,b))
((c)+(add(b,a))
((c)+(((b)+(a))))
gcc 4.4.5 给出
plus(plus(a,b),c)
plus(add(b,a),c)
plus(((b)+(a)),c)
add(c,((b)+(a)))
((c)+(((b)+(a))))
c - X-Macros 的实际使用
我刚刚了解了X-Macros。您见过 X-Macros 的哪些实际用途?他们什么时候是适合这项工作的工具?
c++ - 减少 C++(或 x-treme x-macros)中的代码重复
我正在使用 x-macros 来减少重复量和代码重复,同时为游戏Bitfighter实现 Lua 接口。以下代码工作正常:
到现在为止还挺好。
除了我在几十门课上做的事情基本相同。我真正想做的是在每个类中定义方法表(可以称为任何东西),然后定义两个可以像这样调用的宏:
避免上面所有在块 A 和 B 中重复的代码。显而易见的方法是使用嵌套宏,但不幸的是,这是非法的。
有没有更好的办法?
解决方案
当我发布这个问题时,我很确定答案将是“无法完成”。相反,我有两种方法,其中一种正是我正在寻找的。还对宏的陷阱(有很多)进行了很好的讨论,并提出了一些替代方法。我根据公认的答案开发的实现是干净且易于理解的,脏宏的东西很容易看不到。
在某处的隐蔽洞中:
在每个类文件中:
c++ - #include 在 x 宏中
我想编写一个生成一些代码的 x 宏。该代码依赖于几个标头,旨在在命名空间内生成。
问题是 xmacro 的包含被包含在调用者的命名空间中。有什么办法可以解决这个问题吗?
例子:
xmacro.hpp:
主.hpp:
c - 是否可以修改此 X-Macro 以构建包含数组的结构?如何?
在 SO 上找到了这个非常有用的 Q/A:有没有办法在 C 中循环使用具有不同类型元素的结构?
但是由于我对整个 X-Macro 的东西还很陌生,所以我想知道,是否以及如何将这个示例改编为带有数组的结构 - 如下所示:
这是要适应的:
我的出发点是这样的,但我很确定,格式必须是别的东西,或者必须被替换:
地址类似于 {0x10,0x12,0x0A} - 大小相同。
编辑:
这是我当前如何使用这个结构的一个例子,没有 x 宏:
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.
c - 任何人都可以用示例代码解释 X 宏以使用它们吗?
我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位专家能用“如何使用,如何调用”的例子来解释这个话题,那就更好了。
我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我缺乏使用那些 X 宏的代码片段。
在此先感谢帕莎
c++ - C++ 宏中的函数式编程风格:这在任何地方都有记录吗?
阅读一些 C++ 代码时,我遇到了我称之为函数宏的“函数式”使用,大致如下(这是一个完全程式化的例子来说明这一点):
我对这门语言比较陌生,起初我无法弄清楚这一点,但后来我只通过预处理器 ( g++ -E
) 运行它,你瞧,它解析为:
你看到它在那里做了什么吗?它将宏 NEXT_LEVEL像函数指针一样传递给宏 TOP_LEVEL。看到这可能有多么有用,我想了解更多关于它的信息:将函数传递给其他函数是非常复杂的东西,至少必须对这项技术多说些什么。
然而,尽管进行了大量的谷歌搜索,但我找不到任何证据证明预处理器的这个功能甚至存在,更不用说任何接近文档的东西了: here、here、here和here只是跳过这个的宏教程的四个示例;最后一个甚至有一个名为“高级宏技巧”的部分 - 这肯定符合条件!?
(请注意,这与简单地以另一个评估的函数宏作为参数调用函数宏完全不同- FOO(BAR(2)) 更直接。)
我的问题是:
- 这种行为有实际名称吗?
- 它在任何地方都有记录吗?
- 它是常用的,还是有众所周知的陷阱等?