任何人都可以用示例代码解释X-macros来使用它们吗?

时间:2013-10-25 11:21:32

标签: c macros x-macros

我正在尝试详细了解X-macros主题。但是没有完全清楚这一点。如果任何一位专家用一些例子“如何使用,如何打电话”来解释这个话题会更好。

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

提前致谢 帕塔

2 个答案:

答案 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.xmodule.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);