不需要將其放入特定的.def文件;只使用預處理器是完全可能的。我通常定義一個名爲...LIST
的列表,其中每個元素都包含在...LIST_ELEMENT
之內。根據我將要使用的列表,我將使用逗號分隔除最後一個條目(最簡單)以外的所有列表,或者在一般情況下,可以在每次使用時單獨選擇分隔符。例如:
#include <string.h>
#define DIRECTION_LIST \
DIRECTION_LIST_ELEMENT(up, DIRECTION_LIST_SEPARATOR) \
DIRECTION_LIST_ELEMENT(down, DIRECTION_LIST_SEPARATOR) \
DIRECTION_LIST_ELEMENT(right, DIRECTION_LIST_SEPARATOR) \
DIRECTION_LIST_ELEMENT(left, NO_COMMA)
#define COMMA ,
#define NO_COMMA /**/
#define DIRECTION_LIST_ELEMENT(elem, sep) elem sep
#define DIRECTION_LIST_SEPARATOR COMMA
typedef enum {
DIRECTION_LIST
} direction_t;
#undef DIRECTION_LIST_ELEMENT
#undef DIRECTION_LIST_SEPARATOR
#define DIRECTION_LIST_ELEMENT(elem, sep) void (*move_ ## elem)(struct object_s * object);
#define DIRECTION_LIST_SEPARATOR NO_COMMA
typedef struct object_s {
char *name;
// ...
DIRECTION_LIST
} object_t;
#undef DIRECTION_LIST_ELEMENT
#undef DIRECTION_LIST_SEPARATOR
static void move(object_t *object_p, const char * direction_string)
{
if (0) {
}
#define DIRECTION_LIST_SEPARATOR NO_COMMA
#define DIRECTION_LIST_ELEMENT(elem, sep) \
else if (strcmp(direction_string, #elem) == 0) { \
object_p->move_ ## elem(object_p); \
}
DIRECTION_LIST
#undef DIRECTION_LIST_ELEMENT
#undef DIRECTION_LIST_SEPARATOR
}
這種技術被稱爲X-宏 - http://en.wikipedia.org/wiki/C_preprocessor#X-Macros – qrdl 2009-04-27 18:56:24
完美,這就是我一直在尋找我的慢週一昏昏沉沉的大腦掛鉤。將定義放在一個單獨的文件中,並將其讀入兩次。 謝謝! – 2009-04-27 19:04:15
此技術的一個缺點是IDE和/或調試器可能不夠智能,無法正確解析這些問題。如果是這種情況 - 最好將生成列表作爲構建過程的一部分。 – Hexagon 2009-04-27 19:10:54