【发布时间】:2013-11-04 11:44:22
【问题描述】:
我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位高手能用“如何使用,如何调用”的例子来解释这个话题就更好了。
我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我无法使用那些 X 宏的代码。
提前致谢 帕萨
【问题讨论】:
我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位高手能用“如何使用,如何调用”的例子来解释这个话题就更好了。
我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我无法使用那些 X 宏的代码。
提前致谢 帕萨
【问题讨论】:
你基本上是#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);
【讨论】:
想法是您重新定义宏 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 的定义,以便以后可以重新定义它而不会出现编译器抛出警告。
【讨论】: