Sto tentando di semplificare la dichiarazione di un array, ma ho riscontrato un problema con i preprocessori che sto utilizzando. Il mio codice iniziale sia simile alla seguente:Il preprocessore non riesce a causa di - '#' non è seguito da un parametro macro
#define REQ_ENTRY(parm_1, parm_2) \
#if defined(parm_1) \
{ parm_1, parm_2 }, \
#endif
typedef struct {
int parm1,
parm2;
} MyTypedef_t;
static const MyTypedef_t MyList[] =
{
REQ_ENTRY(ID_1, 1)
REQ_ENTRY(ID_2, 2)
REQ_ENTRY(ID_3, 3)
REQ_ENTRY(ID_4, 4)
REQ_ENTRY(ID_5, 5)
};
La compilazione fallisce, ovviamente, con il messaggio di errore di "errore: '#' non è seguito da un parametro di macro". La ragione di questo è spiegato qui (Why compiler complain about this macro declaration)
Fondamentalmente, sto cercando di evitare dichiara la matrice come segue, che funziona:
static const MyTypedef_t MyList[] =
{
#if defined (ID_1)
{ ID_1, 1 },
#endif
#if defined (ID_2)
{ ID_2, 2 },
#endif
#if defined (ID_3)
{ ID_3, 3 },
#endif
#if defined (ID_4)
{ ID_4, 4 },
#endif
#if defined (ID_5)
{ ID_5, 5 },
#endif
};
l'elenco può essere piuttosto lungo, variabili a seconda della costruire il tipo del progetto. Ho provato a pensare di usare x-macros, ma penso che avrei lo stesso problema. Spero che qualcuno possa vedere un modo per creare i macro del preprocessore in modo tale da ottenere la sintassi dello zucchero originale? Qualsiasi consiglio é ben accetto.
Puoi racchiudere '# ifdef' attorno a una definizione di macro; non puoi incorporarlo all'interno di uno. Inoltre, non è possibile testare direttamente se un argomento di una macro è una macro definita.Sfortunatamente, il nay-say è la parte facile; non è chiaro che ci sia un buon modo per evitare il codice originale. Questo è quello che ho usato in circostanze equivalenti. –