Linux программирование в примерах | страница 76



>if (some_system_call(param1, param2) < 0) {

> fprintf(stderr, "%s: %d, %d: some_system_call failed: %s\n",

>  argv[0], param1, param2, strerror(errno));

> return 1;

>}

По всей книге вы увидите множество примеров использования обеих функций.

4.3.2. Стиль сообщения об ошибках

Для использования в сообщениях об ошибках С предоставляет несколько специальных макросов. Наиболее широкоупотребительными являются >__FILE__ и >__LINE__, которые разворачиваются в имя исходного файла и номер текущей строки в этом файле. В С они были доступны с самого начала. C99 определяет дополнительный предопределенный идентификатор, >__func__, который представляет имя текущей функции в виде символьной строки. Макросы используются следующим образом:

>if (some_system_call(param1, param2) < 0) {

> fprintf(stderr, "%s: %s (%s %d): some_system_call(%d, %d) failed: %s\n",

>  argv[0], __func__, __FILE__, __LINE__,

>  param1, param2, strerror(errno));

> return 1;

>}

Здесь сообщение об ошибке включает не только имя программы, но также и имя функции, имя исходного файла и номер строки. Полный список идентификаторов, полезных для диагностики, приведен в табл. 4.2.


Таблица 4.2. Диагностические идентификаторы C99

ИдентификаторВерсия СЗначение
>__DATE__C89Дата компиляции в виде «>Mmm nn yyyy»
>__FILE_ОригинальнаяИмя исходного файла в виде «>program.c»
>__LINE__ОригинальнаяНомер строки исходного файла в виде 42
>__TIME__C89Время компиляции в виде «>hh:mm:ss»
>__func__C99Имя текущей функции, как если бы было объявлено >const char __func__[] = "name"

Использование >__FILE__ и >__LINE__ было вполне обычно для ранних дней Unix, когда у большинства людей были исходные коды и они могли находить ошибки и устранять их. По мере того, как системы Unix становились все более коммерческими, использование этих идентификаторов постепенно уменьшалось, поскольку знание положения в исходном коде дает немного пользы, когда имеется лишь двоичный исполняемый файл.

Сегодня, хотя системы GNU/Linux поставляются с исходными кодами, указанный исходный код часто не устанавливается по умолчанию. Поэтому использование этих идентификаторов для сообщений об ошибках не представляет дополнительной ценности. GNU Coding Standards даже не упоминает их.

4.4. Ввод и вывод

Все операции Linux по вводу/выводу осуществляются посредством дескрипторов файлов. Данный раздел знакомит с дескрипторами файлов, описывает, как их получать и освобождать, и объясняет, как выполнять с их помощью ввод/вывод.