Próbuję uprościć deklarację tablicy, ale wystąpił problem z preprocesorami, których używam. Mój początkowy kod wygląda tak:Preprocesor przestaje działać z powodu - po '#' nie następuje parametr makro
#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)
};
Kompilacja nie powiedzie się, oczywiście, z komunikatem o błędzie „Błąd:«#»nie następuje makro parametru”. Powodem tego jest wyjaśnione tutaj (Why compiler complain about this macro declaration)
Zasadniczo, staram się unikać deklarowania tablicy jak poniżej, które działa:
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
};
Lista może być dość długi i różnią się w zależności od typ budowy projektu. Próbowałem myśleć o używaniu x-makr, ale myślę, że miałbym ten sam problem. Mam nadzieję, że ktoś może zobaczyć sposób tworzenia makr preprocesora w taki sposób, żebym mógł osiągnąć oryginalną składnię cukru? Każdy wgląd jest bardzo doceniany.
Możesz zawijać '# ifdef' wokół definicji makra; nie możesz go osadzić w jednym. Ponadto nie można bezpośrednio sprawdzić, czy argument do makra jest zdefiniowanym makrem.Niestety, naiwne powiedzenie jest łatwą częścią; nie jest jasne, czy istnieje dobry sposób na uniknięcie oryginalnego kodu. Właśnie tego użyłem w podobnych okolicznościach. –