2016-04-29 4 views
7

Ich habe folgende paar C Präprozessormakros, die ich benutze:0s zu einer unvollständigen Makroparameterliste Anfügen

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__, 0, 0, 0, 0) 

Wenn FILL_PARAMS mit 1 Aufruf, 2 oder 3 Parametern, die später (nicht spezifiziert) werden wie erwartet in 0 umgewandelt, aber wenn keine Argumente angegeben werden, liegt ein Fehler vor.

Gibt es eine Möglichkeit, Unterstützung für No-Parameter hinzuzufügen?

Klarstellung:
Derzeit werden folgende Anwendungen unterstützt:

FILL_PARAMS(1)   // => 1, 0, 0, 0 
FILL_PARAMS(1, 2)  // => 1, 2, 0, 0 
FILL_PARAMS(1, 2, 3) // => 1, 2, 3, 0 

Und ich will Unterstützung für die folgenden Rand Fall hinzuzufügen:

FILL_PARAMS()   // => 0, 0, 0, 0 

Hilfe willkommen sein wird.

+0

Es kann mit etwas Anstrengung getan werden. Werfen Sie einen Blick auf [wie es hier gemacht wurde] (http://stackoverflow.com/questions/34713046/what-is-the-meaning-of-this-c-macro/34713272) –

+2

Was ist los mit 'FILL_PARAMS (0) 'für den leeren Fall? – Leandros

+0

@Leandros. Aber das kann auch eine Einschränkung sein. – sjsam

Antwort

2

eine Hack-ish Lösung gefunden:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__ + 0, 0, 0, 0, 0) 

, die mit am wenigsten den folgenden Testfällen funktionieren.

int i = 120; 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS()); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(i)); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1)); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2)); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3)); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3, 4)); 
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3, i)); 
0

Sie dies auf vielfältige Weise erreicht werden kann, der einfachste Weg ist

FILL_PARAMS(0) 

als leere Fall zu verwenden.

Eine andere, kompliziertere und umständliche Art und Weise zu verwenden, ist immer das Komma nach dem letzten Parameter müssen:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__ 0, 0, 0, 0) 

/* called like: */ 
FILL_PARAMS() 
FILL_PARAMS(1,) 
FILL_PARAMS(1,2,) 
FILL_PARAMS(1,2,3,) 

Oder mit ein wenig kreativ mit GCCs Komma Schlucken Erweiterung zu sein:

#define TAKE4(a1, a2, a3, a4, a5, ...) a2, a3, a4, a5 
#define FILL_PARAMS(...) TAKE4(0, ##__VA_ARGS__, 0, 0, 0, 0) 
Verwandte Themen