Используйте __LINE__
, но каков его тип?
LINE Предполагаемый номер строки (в текущем исходном файле) текущей исходной строки (целочисленная константа).
В качестве целочисленной константы код часто может предполагать, что значение равно __LINE__ <= INT_MAX
, поэтому тип равен int
.
Для печати на языке C printf()
требуется соответствующий спецификатор: "%d"
. Это гораздо меньшая проблема в C++ с cout
.
Педантизм: если номер строки превышает INT_MAX
1 (что вполне возможно для 16-битного int
), компилятор, надеюсь, выдаст предупреждение. Пример:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
В качестве альтернативы код может заставить более широкие типы предотвращать такие предупреждения.
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__));
Избегайте printf()
Чтобы избежать всех ограничений на целочисленные значения: strify. Код может печатать напрямую без вызова printf()
: этого следует избегать при обработке ошибок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 Конечно, использование такого большого файла является плохой практикой программирования, но, возможно, сгенерированный машиной код может стать слишком большим.
2 Иногда при отладке код просто работает не так, как ожидалось. Вызов сложных функций, таких как *printf()
, сам по себе может вызвать проблемы по сравнению с простым fputs()
.
person
chux - Reinstate Monica
schedule
19.02.2020