Пользуюсь __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()
Чтобы избежать всех целочисленных ограничений: stringify . Код можно было печатать напрямую без 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()
.