我刚学会了X-Macros.您看过X-Macros的实际用途?他们什么时候成为工作的合适工具?
我从教育/黑客的角度来问这个问题,(我真的不想这样编码).
是否可以仅使用C预处理程序指令实现while循环.我知道宏不能递归扩展,那么如何实现呢?
是否可以编写一个返回其参数数量的C宏?
我想做的事情:
foo(1) -> 1
foo(cat, dog) -> 2
foo(red, green, blue) -> 3
Run Code Online (Sandbox Code Playgroud)
如果可以以这样的方式定义这个宏以便它与##一起工作,那就更好了
foo(1) -> bar1(1)
foo(cat, dog) -> bar2(cat, dog)
foo(red, green, blue) -> car3(red, green, blue)
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:我真的想要一个宏,而不是一个函数.使用功能的建议将被低估.
在写C宏的时候,有个技巧叫做“序列迭代”。它看起来像这样:
#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define FUNCTION(name) void name();
#define FUNCTION_TABLE(seq) CAT(FUNCTION_TABLE_1 seq, _END)
#define FUNCTION_TABLE_1(x) FUNCTION(x) FUNCTION_TABLE_2
#define FUNCTION_TABLE_2(x) FUNCTION(x) FUNCTION_TABLE_1
#define FUNCTION_TABLE_1_END
#define FUNCTION_TABLE_2_END
FUNCTION_TABLE((x) (y) (z) (e))
Run Code Online (Sandbox Code Playgroud)
序列,即 FUCTION_TABLE 的参数,将被一一处理。但是,据我所知,令牌不会在同一范围内扩展两次。因为它被“涂成蓝色”。当 FUNCTION_TABLE_2 展开时,宏 FUNCTION_TABLE_1 已经绘制好了。为什么还要扩容?
在后C 预处理器递归宏中使用 Paul Fultz II 的解决方案,我想扩展无限数量的括号宏参数,例如
#define MY_CHAIN (alpha) (beta) (gamma)
Run Code Online (Sandbox Code Playgroud)
到一个逗号分隔的列表中,该列表可以传递给可变参数宏,例如
CHAIN_COMMA(MY_CHAIN) // alpha, beta, gamma
Run Code Online (Sandbox Code Playgroud)
在下面的示例中[alpha] [beta] [gamma],我可以扩展为大括号并使用我尝试过的所有内容分隔列表,但逗号除外alpha :: beta :: gamma。
这是我的完整(编译)代码:
#include <iostream>
using namespace std;
// unrelated macro utilities
#define SEE(expression) cout << #expression ": " << STR(expression) << endl;
#define CMD(function, ...) function(__VA_ARGS__)
#define STR(s) CMD(STR_, s)
#define STR_(s) #s
// concatenation
#define CAT(x, y) CAT_(x, y)
#define CAT_(x,y) x ## y // error from CHAIN_COMMA: passed 4 …Run Code Online (Sandbox Code Playgroud)