Uso __LINE__
, pero ¿cuál es su tipo?
LÍNEA El supuesto número de línea (dentro del archivo fuente actual) de la línea fuente actual (una constante entera).
Como una constante entera , el código a menudo puede asumir que el valor es __LINE__ <= INT_MAX
y, por tanto, el tipo int
.
Para imprimir en C, printf()
necesita el especificador de juego: "%d"
. Esta es una preocupación mucho menor en C ++ con cout
.
Preocupación pedante: si el número de línea excede INT_MAX
1 (algo concebible con 16 bits int
), es de esperar que el compilador produzca una advertencia. Ejemplo:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
Alternativamente, el código podría obligar a tipos más amplios a evitar tales advertencias.
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__));
Evitar printf()
Para evitar todas las limitaciones de enteros: stringify . El código podría imprimirse directamente sin una printf()
llamada: algo bueno para evitar en el manejo de errores 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 Ciertamente una mala práctica de programación para tener un archivo tan grande, sin embargo, quizás el código generado por la máquina puede ser alto.
2 En la depuración, a veces el código simplemente no funciona como se esperaba. Llamar a funciones complejas como *printf()
puede generar problemas en sí mismo frente a un simple fputs()
.