macro variadic con 0 argomenti a C99
Domanda
Ho qualche codice di debug che appare come il seguente:
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void __my_error(const char*loc, const char *fmt, ...);
#define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)
L'ultima macro è utilizzata in modo da poter inserire la posizione in output di debug da cui si è verificato l'errore. Tuttavia, quando chiamo la funzione in questo modo:
my_error("Uh oh!");
Vorrei come il mio codice di essere C99, così ho trovato quando questo compilazione, ottengo il seguente errore:
error: ISO C99 requires rest arguments to be used
So che posso risolvere questo problema modificando la chiamata a
my_error("Uh oh!", NULL);
Ma c'è un modo per rendere questo look meno brutto? Grazie!
Soluzione
Vedo due soluzioni a questo problema. (Tre se si conta 'bastone con gcc').
Extra caso macro speciale
Aggiungi una nuova macro per quando si desidera stampare una stringa fissa.
#define my_errorf(str) my_error(str, NULL)
Pro :. Importo minimo di codice aggiuntivo
Con:. E 'facile da utilizzare la macro sbagliato (ma almeno si nota questo al momento della compilazione)
fmt
Put all'interno del '...'
vararg macro di può avere solo __VA_ARGS__ come parametro (a differenza di funzioni vararg). Così si può mettere l'argomento fmt
all'interno del __VA_ARGS__ e cambiare la vostra funzione.
void __my_error(const char *loc, ...);
#define my_error(...) __my_error(AT, __VA_ARGS__)
Pro :. Una sintassi / macro per tutti i messaggi di errore
Con :. Richiede riscrittura della funzione __my_error
, che potrebbe non essere possibile