#define STRIP0 0
#define STRIP1 1
#define STRIP2 2
#define STRIP3 3
#define PINS0 2,3,4
#define PINS1 5,6,7
#define PINS2 8,9,10
#define PINS3 11,12,13
#define PINS(STRIP) { (STRIP) == (STRIP0) ? PINS0 :\
(STRIP) == (STRIP1) ? PINS1 :\
(STRIP) == (STRIP2) ? PINS2 :PINS3}
jetzt, wenn, wenn ich eine Funktion aufrufen, die foo(int,int,int);
3 alle Argumente vom Typ int nimmt wie folgt foo(PINS1);
dann erstellt die Funktion und funktioniert wie erwartet (alle Argumente als bestanden, wenn der #define war ersetzt durch "5,6,7")Makros Funktionsargumente wählen
aber wenn ich das Makro für die Auswahl der Satz von Pins wie foo(PINS(STRIP1));
verwenden, dann geht die Argumentauswahl drunter und drüber. In diesem speziellen Fall wird die Liste der fehlerhaften Argumente "7,12,13" und für foo(PINS(STRIP0));
wird "4,12,13". Es gibt ein Muster, das ich sehe, aber ich habe nicht das Fachwissen, um zu sagen und zu korrigieren, was bei der Kompilierung passiert Zeit.
Wenn Sie das 'PINS' Funktion-ähnliche Makro verwenden, haben Sie zwei Probleme: Das erste ist die geschweifte Klammern, die Sie um den gesamten Ausdruck haben. Die zweite ist, dass anstelle der Übergabe mehrerer Argumente übergeben Sie ein einziges Argument, denn dann Komma wird nicht zu einem Argumenttrennzeichen, sondern zum Kommaausdruck. Sie sollten Ihre Verwendung von Makros überdenken, vielleicht verwenden Sie stattdessen einen Inline-Funktions-Wrapper? Oder zumindest das Makro modifizieren, vielleicht die Funktion als Argument nehmen und den Aufruf innerhalb des Makros "body" haben? –
Warum schreibst du nicht einfach ein "if/else" – Danh
@Someprogrammerdude Ich werde die geschweiften Klammern entfernen und die Frage bearbeiten, aber es hatte keinen Effekt in der Ausgabe. Wenn ich dies 'foo (PINS1);' (wie in der Frage angegeben) die Funktion nimmt die 3 Zahlen als Argumente selbst, die mich zu der Annahme, dass das Komma als Ausdruck nicht statt Compiler erkannte, dass es gibt 3 Argumente und das führte Deshalb ging es weiter. das ist der Grund, warum ich dachte, ein Makro zu tun, das die 'PINS0' oder' PINS1' auswählt, funktioniert, aber es hat nicht funktioniert. Ihr Vorschlag, die Funktion als Argument im Makro zu haben, ist wahrscheinlich, was Krzaq schlägt –