Mam na myśli przykład kodu z projektu opensource tig. Co jest świetnym narzędziem!Jaka jest potrzeba zdefiniowania Enum/Struct przez makra?
file: tig.c
walczę by znaleźć powód do definiowania żądania wyliczanie następująco:
enum request {
#define REQ_GROUP(help)
#define REQ_(req, help) REQ_##req
/* Offset all requests to avoid conflicts with ncurses getch values. */
REQ_UNKNOWN = KEY_MAX + 1,
REQ_OFFSET,
REQ_INFO,
/* Internal requests. */
REQ_JUMP_COMMIT,
#undef REQ_GROUP
#undef REQ_
};
nawet struktur jak dobrze ..
static const struct request_info req_info[] = {
#define REQ_GROUP(help) { 0, NULL, 0, (help) },
#define REQ_(req, help) { REQ_##req, (#req), STRING_SIZE(#req), (help) }
REQ_INFO
#undef REQ_GROUP
#undef REQ_
};
jak widać REQ_GROUP
został #zdefiniowany wiele razy tworząc zamieszanie .. co najmniej dla mnie. Cóż, wiem, że może istnieć dobry powód do zrobienia jako taki. Jaki jest faktyczny powód, aby ukryć definicję enum/struct w kodzie za pomocą makr?
Aby zrozumieć, co się dzieje, często uważam, że warto skompilować źródło z opcjami gcc '-dNI -E', co powoduje, że wstępnie przetworzone źródło, ale pokazujące definicje makr, bez powiększania makr i Instrukcje '# include' są nienaruszone. –
Poniższe odpowiedzi mają to.Ogólna nazwa tej strategii to "X macros", wikipedia ma stronę o tym: http://en.wikipedia.org/wiki/X_Macro jak robi Dr Dobbs: http://www.drdobbs.com/cpp/the -x-macro/228700289 – Vicky
@Vicky drdobbs link was a gem! dzięki! – ashishsony