Використання __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()
Щоб уникнути всіх цілих обмежень: строфікуйте . Код можна надрукувати безпосередньо без 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()
.