2016-05-13 13 views
1

Ich mag die ein Makro verwenden möchten folgende:## __ VA_ARGS__ nicht Komma beim Schlucken, wenn Null args unter C99

#define x(...) y(a,##__VA_ARGS__,b) 

zu erweitern, wie so:

x(); -> y(a,b); 
x(1); -> y(a,1,b); 

Mit -std=gnu99, es funktioniert perfekt.

Mit -std=c99 jedoch sieht es wie folgt aus:

x(); -> y(a,,b); 
x(1); -> y(a,1,b); 

Die ## macht keinen Unterschied - es ist nicht das Komma zu schlucken.

In anderen Verwendungen unter C99, z.B. #define x(a,...) y(a,##__VA_ARGS__), Komma-Schlucken funktioniert gut.

Was kann ich tun, wenn überhaupt, um das gewünschte Komma-Schluckverhalten unter clangs -std=c99, entweder mit der GNU-Erweiterung ## oder durch eine andere Methode zu bekommen?

+0

Also, wie funktioniert das auf der Seite der Implementierung (d. H. Wie verwendet die Funktion die Variablenargumente)? – trojanfoe

+0

@trojanfoe Danke für den Kommentar, aber das ist nicht im Rahmen dieser Frage. (Dies ist keine XY-Frage.) – Max

+0

@trojanfoe Sure: Ich benutze dieses Makro, um 'a() 'aufzurufen, wenn es keine Argumente gibt, oder' b (x) 'wenn es ein Argument gibt:' GET_MACRO (_0 , ## __ VA_ARGS__, b, a) (__ VA_ARGS __) '. – Max

Antwort

1

Ja, ##__VA_ARGS__ ist eine GNU-Erweiterung.

+0

Siehe meine Frage: "In anderen Verwendungen unter C99, zB' # definieren x (a, .. .) y (a, ## __ VA_ARGS __) ', Komma-Schlucken funktioniert gut." – Max

+0

Und auch, ich frage, ob es einen Weg gibt, mit '## __ VA_ARGS__' oder nicht. – Max

+0

Probieren Sie es einfach mit 'std = c99 -pedantic' aus und die Zeile' #define x (a, ...) y (a, ## __ VA_ARGS __) 'gab die Warnung' Token einfügen von ',' und __VA_ARGS__ ist eine GNU-Erweiterung ". Ich denke also, dass das Komma-Schluckverhalten unter C99 spezifisch für Ihre Compiler-/Befehlszeilenargumente war. Es ist kein Standard C99. –

1

Das ist das erwartete Verhalten. Es gibt keine Standardmethode, das Komma zu schlucken.

Glücklicherweise gcc, clang und xlc Unterstützung der ##__VA_ARGS__ Gnu Erweiterung und msvc schluckt das automatisch Komma.

Wenn Sie nicht wollen, auf oben genannten Spracherweiterungen verlassen, die idiomatische ISO C90 Weise variable Argument Makros zu bekommen war wie folgt aus:

#define x(args) y args 

/* notice the extra parantheses */ 
x((a, b, c, d)); 

Wenn Sie nicht wollen, entweder diese verwenden Lösungen, können Sie immer Argument zählen, wie beantwortet here.