Per i debugbuild, di solito uso Clang, in quanto formatta meglio avvisi e errori, e rende un po 'più facile rintracciarli e correggerli.Le macro Variadic non sono standard?
Ma di recente dopo l'aggiunta di una macro con argomenti variadic, Clang mi ha detto quanto segue (da un progetto fittizio):
main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...) stuff_i(args)
so che macroname(args...)
compila bene in una vasta gamma di compilatori, tra cui VisualStudio, Studio Sole e, naturalmente, GCC. Ma solo per assicurarsi che clang ha ragione, ho provato altri due modi di espandere gli argomenti variadic:
Numero 1:
#define stuff1(...) stuff_i(...)
Numero 2:
#define stuff2(...) stuff_i(__VA_ARGS__)
su entrambi ricevo questo messaggio:
main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
... il che mi fa chiedere se le macro variadic sono in realtà parte dello standard di C++ (una e naturalmente so che il preprocessore è interpretato in modo indipendente)?
C99 e C++ 0x supportano ufficialmente la versione 2. C++ 03 non supporta le macro variadic.La versione 1 è un'estensione specifica del GCC – sellibitze
(come il tuo nome) quando compili con GCC c'è l'opzione '-pedantic' che dovrebbe riportare le estensioni utilizzate. Come Array a lunghezza variabile o Macro variabile, ad esempio. In GCC sono inclusi semplicemente perché poiché fanno parte di C99, la logica è già implementata, quindi deve essere sembrata una buona idea lasciare che il C++ folk ne tragga beneficio :) –
@Matthieu M: Sì, in effetti ho anche pensato che questa funzione sarebbe parte di C++, dato che è già parte del C99 ... interessantemente, gcc non dice che i macro variadic nominati sono in effetti delle estensioni GNU, ma invece dice solo che non fanno parte dello standard: 'warning: ISO C non consente macro denominate variadic' –