1

我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位专家能用“如何使用,如何调用”的例子来解释这个话题,那就更好了。

我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我缺乏使用那些 X 宏的代码片段。

在此先感谢帕莎

4

2 回答 2

2

想法是您重新定义宏 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.xto的内容module.cX因为已经定义了宏,预处理器通过调用对每一行进行文本替换X

第三行#undef X只是为了方便。我们删除了 的定义,X以便以后可以重新定义它而不会引发编译器警告。

于 2013-10-25T11:32:55.327 回答
1

您基本上#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);
于 2013-10-25T11:29:41.997 回答