我正在尝试详细了解X-macros主题。但是没有完全清楚这一点。如果任何一位专家用一些例子“如何使用,如何打电话”来解释这个话题会更好。
我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我不缺乏使用这些X-macro的代码片段。
提前致谢 帕塔
答案 0 :(得分:1)
想法是重新定义宏X以使数据符合您当前的目的。
您至少需要2个文件。首先是一个包含必要信息的大表,以及其他使用数据的表。
<强> table.x:强>
X("Human", 2, HUMAN)
X("Spider", 8, SPIDER)
<强>的module.c:强>
// ID constants
enum {
#define X(description, legs, id) id,
#include "table.x"
#undef X
COUNT // Last element is total number of elements
};
// Leg array
int NumberOfLegs [] = {
#define X(description, legs, id) legs,
#include "table.x"
#undef X
};
// Description array
const char * Descriptions [] = {
#define X(description, legs, id) description,
#include "table.x"
#undef X
};
预处理输出为:
// ID constants
enum {
HUMAN,
SPIDER,
COUNT // Last element is total number of elements
};
// Leg array
int NumberOfLegs [] = {
2,
8,
};
// Description array
const char * Descriptions [] = {
"Human",
"Spider",
};
在上面的示例中,可以轻松地向表中添加新项。如果您单独管理这些列表,则会更容易出错。
修改强>
关于宏用法的一些说明。
在第一行#define X(description, legs, id) legs,
中,我们定义了X
宏。宏必须具有与我们table.x
在每一行上相同数量的参数。对于此用法,我们只对legs
参数感兴趣。请注意,参数名称没有意义,我们也可以#define X(a, b, c) b,
。
第二行#include "table.x"
包含table.x
到module.c
的内容。由于已定义宏X
,因此预处理器通过调用X
对每行进行文本替换。
第三行#undef X
仅为方便起见。我们删除X
的定义,以便以后可以在没有编译器抛出警告的情况下进行重新编译。
答案 1 :(得分:0)
您基本上#define
变量列表作为占位符宏X
的参数:
#define X_LIST_OF_VARS \
X(my_first_var) \
X(another_variable) \
X(and_another_one)
然后使用模板:
#define X(var) do something with var ...
X_LIST_OF_VARS
#undefine X
制作代码块。例如,打印所有变量:
#define X(var) printf("%d\n", var);
X_LIST_OF_VARS
#undefine X
将生成:
printf("%d\n", my_first_var);
printf("%d\n", another_variable);
printf("%d\n", and_another_one);