Ich versuche, die Deklaration eines Arrays zu vereinfachen, stieß aber auf ein Problem mit den Präprozessoren, die ich verwende. Mein anfänglicher Code sieht wie folgt aus:Preprocessor schlägt fehl - '#' wird nicht von einem Makroparameter gefolgt
#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)
};
Der Build fehlschlägt, natürlich mit der Fehlermeldung „Fehler:‚#‘wird nicht von einem Makroparameter gefolgt“. Der Grund dafür wird hier erklärt (Why compiler complain about this macro declaration)
Grundsätzlich ich das Array zu vermeiden versuchen zu erklären, wie die folgt, was funktioniert:
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
};
Die Liste kann ziemlich lang sein und variiert in Abhängigkeit von der Build-Typ des Projekts. Ich habe versucht, X-Makros zu verwenden, aber ich denke, ich hätte das gleiche Problem. Ich hoffe, dass jemand eine Möglichkeit sieht, die Präprozessor-Makros so zu erstellen, dass ich die ursprüngliche Zuckersyntax erreichen kann? Jede Einsicht wird sehr geschätzt.
Sie können '# ifdef 'um eine Makrodefinition wickeln; Sie können es nicht in einem einbetten. Außerdem können Sie nicht direkt testen, ob ein Argument für ein Makro ein definiertes Makro ist.Leider ist das Neinsagen der einfache Teil; Es ist nicht klar, dass es einen guten Weg gibt, den ursprünglichen Code zu vermeiden. Das habe ich unter ähnlichen Umständen benutzt. –