Mi riferisco a un esempio di codice dal progetto opensource tig. Che è un ottimo strumento!Qual è la necessità di definire un Enum/Struct tramite macro?
di file: tig.c
Ho difficoltà a trovare una ragione per la definizione del richiesta enumerazione come segue:
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_
};
anche strutture come pure ..
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_
};
come si può vedere REQ_GROUP
è stato # definito più volte creando confusione .. almeno per me. Beh, so che potrebbe esserci una buona ragione per fare come tale. Qual è il vero motivo per nascondere la definizione enum/struct nel codice usando le macro?
Per capire cosa sta accadendo, spesso trovo utile compilare una sorgente con le opzioni gcc '-dNI -E' che risulta nell'origine preelaborata, ma mostra le definizioni di macro, senza che le macro vengano espanse e con affermazioni '# include' intatte. –
Le risposte qui sotto hanno.Un nome generico per questa strategia è "X macros", wikipedia ha una pagina a riguardo: http://en.wikipedia.org/wiki/X_Macro così come Dr Dobbs: http://www.drdobbs.com/cpp/the -x-macro/228700289 – Vicky
@Vicky drdobbs link era una chicca! Grazie! – ashishsony