Usa __LINE__
, ma qual è il suo tipo?
LINE Il numero di riga presunto (all'interno del file sorgente corrente) della riga sorgente corrente (una costante intera).
Come costante intera , il codice può spesso assumere che il valore sia __LINE__ <= INT_MAX
e quindi il tipo lo è int
.
Per la stampa in C, printf()
ha bisogno l'identificatore di corrispondenza: "%d"
. Questa è una preoccupazione molto minore in C ++ con cout
.
Preoccupazione pedante: se il numero di riga supera INT_MAX
1 (in qualche modo concepibile con 16 bit int
), si spera che il compilatore produca un avviso. Esempio:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
In alternativa, il codice potrebbe forzare tipi più ampi a prevenire tali avvisi.
printf("Not logical value at line number %ld\n", (long) __LINE__);
//or
#include <stdint.h>
printf("Not logical value at line number %jd\n", INTMAX_C(__LINE__));
Evitare printf()
Per evitare tutte le limitazioni relative ai numeri interi: stringify . Il codice potrebbe essere stampato direttamente senza una printf()
chiamata: una cosa carina da evitare nella gestione degli errori 2 .
#define xstr(a) str(a)
#define str(a) #a
fprintf(stderr, "Not logical value at line number %s\n", xstr(__LINE__));
fputs("Not logical value at line number " xstr(__LINE__) "\n", stderr);
1 Sicuramente una cattiva pratica di programmazione per avere un file così grande, ma forse il codice generato dalla macchina può andare alto.
2 Nel debug, a volte il codice semplicemente non funziona come sperato. Chiamare funzioni complesse come *printf()
può incorrere in problemi rispetto a un semplice file fputs()
.