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_MAXa 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_MAX1 (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().