【发布时间】:2018-02-27 02:30:04
【问题描述】:
是否可以检查 X-macro 定义的列表中是否存在条目?鉴于下面的示例代码,我希望 #if defined(GEORGE) 条件为真。
编辑:当然没有明确的#define GEORGE。我希望有一种方法来检查列表中的条目(在预处理器中),我只想在列表中进行声明。这可能是不可能的,但我想我问了。
谢谢!
#include <stdio.h>
#define NAMES \
X( JOHN, "John Adams" ) \
X( GEORGE, "George Washington" ) \
X( ABRAHAM, "Abraham Lincoln ")
#define X(_id, _name) _id,
typedef enum {
NAMES
} names_e;
#undef X
typedef struct {
char *name;
} names_t;
#define X(_id, _name) [_id] = { .name = _name },
static names_t const names[] = {
NAMES
};
#undef X
int main(void) {
int i;
for (i=0; i < sizeof(names)/sizeof(names[0]); i++) {
printf("%s\n", names[i].name);
}
printf("names[ABRAHAM] = %s\n", names[ABRAHAM].name);
#if defined(GEORGE)
printf("names[GEORGE] = %s\n", names[GEORGE].name);
#endif
return 0;
}
输出
John Adams
George Washington
Abraham Lincoln
names[ABRAHAM] = Abraham Lincoln
【问题讨论】:
-
不,这是不可能的。 C 预处理器对数组一无所知。您没有在预处理器中定义任何名为
GEORGE的东西,您只是使用该宏扩展为枚举和数组初始化,这些初始化将由编译器的后续阶段处理。 -
#if defined(GEORGE)如果你是真的#define GEORGE
标签: c c-preprocessor x-macros