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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top