Użyj __LINE__
, ale jaki jest jego typ?
LINIA Przypuszczalny numer wiersza (w bieżącym pliku źródłowym) bieżącego wiersza źródłowego (stała całkowita).
Jako stała liczba całkowita kod często przyjmuje wartość, __LINE__ <= INT_MAX
a więc typ jest int
.
Aby drukować w C, printf()
potrzebuje specyfikator dopasowanie: "%d"
. Jest to znacznie mniejszy problem w C ++ z cout
.
Pedantyczna obawa: jeśli numer linii przekroczy INT_MAX
1 (nieco wyobrażalne w przypadku wersji 16-bitowej int
), miejmy nadzieję, że kompilator wyświetli ostrzeżenie. Przykład:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
Alternatywnie, kod mógłby zmusić szersze typy do uprzedzania takich ostrzeżeń.
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__));
Uniknąć printf()
Aby uniknąć wszystkich ograniczeń liczb całkowitych: stringify . Kod może być drukowany bezpośrednio bez printf()
wywołania: miła rzecz, której należy unikać w obsłudze błędów 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 Z pewnością kiepska praktyka programistyczna przy tak dużym pliku, ale być może kod generowany maszynowo może być wysoki.
2 Podczas debugowania czasami kod po prostu nie działa zgodnie z oczekiwaniami. Wywoływanie złożonych funkcji, takich jak *printf()
samo w sobie, może powodować problemy, a nie proste fputs()
.