我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位专家能用“如何使用,如何调用”的例子来解释这个话题,那就更好了。
我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我缺乏使用那些 X 宏的代码片段。
在此先感谢帕莎
想法是您重新定义宏 X 以使数据适合您当前的目的。
您至少需要 2 个文件。首先是一个包含必要信息的巨大表格,以及使用数据的其他表格。
表.x:
X("Human", 2, HUMAN)
X("Spider", 8, SPIDER)
模块.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
to的内容module.c
。X
因为已经定义了宏,预处理器通过调用对每一行进行文本替换X
。
第三行#undef X
只是为了方便。我们删除了 的定义,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);