Керниган и Ритчи - Язык программирования Си (793773), страница 62
Текст из файла (страница 62)
Имя исходного файла и номерстроки будут взяты из макросов __FILE__ и __LINE__.Если в момент включения файла <assert.h> было определено имя NDEBUG, то макрос assertигнорируется.В 7. Списки аргументов переменной длины: <stdarg.h>Заголовочный файл <stdarg.h> предоставляет средства для перебора аргументов функции, количество итипы которых заранее не известны.Пусть посларг — последний именованный параметр функции f с переменным числом аргументов. Внутри fобъявляется переменная ар типа va_list, предназначенная для хранения указателя на очереднойаргумент:va_list ар;Прежде чем будет возможен доступ к безымянным аргументам, необходимо один раз инициализировать ар,обратившись к макросу va_start:va_start(va_list ар, посларг);С этого момента каждое обращение к макросу:тип va_arg(va_list ар, тип);будет давать значение очередного безымянного аргумента указанного типа, и каждое такое обращение будетвызывать автоматическое приращение указателя ар, чтобы последний указывал на следующий аргумент.Один раз после перебора аргументов, но до выхода из f необходимо обратиться к макросуvoid va_end(va_list ар);В 8.
Дальние переходы: <setjmp. h>Объявления в <setjmp.h> предоставляют способ отклониться от обычной последовательности "вызов —возврат"; типичная ситуация — необходимость вернуться из "глубоко вложенного" вызова функции наверхний уровень, минуя промежуточные возвраты.int setjmp(jmp_buf env)Макрос setjmp сохраняет текущую информацию о вызовах в env для последующего ееиспользования в longjmp . Возвращает нуль, если возврат осуществляется непосредственно изsetjmp, и не нуль, если — от последующего вызова longjmp.
Обращение к setjmp возможнотолько в определенных контекстах; в основном это проверки в if, switch и циклах, причем только впростых выражениях отношения.if (setjmp() == 0)/* после прямого возврата */else/* после возврата из longjmp */void longjmp(jmp_buf env, int val)longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, поинформации из env; выполнение программы возобновляется, как если бы функция setjmp толькочто отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в моментобращения к longjmp функция, содержащая вызов setjmp, уже "отработала" и осуществилавозврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения кlongjmp; setjmp не сохраняет значений.В 9.
Сигналы: <signal. h>Заголовочный файл <signal.h> предоставляет средства для обработки исключительных ситуаций,возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником илиошибкой в вычислениях.void (*signal(int sig, void (*handler)(int)))(int)signal устанавливает, как будут обрабатываться последующие сигналы. Если параметр handlerимеет значение SIG_DFL, то используется зависимая от реализации "обработка по умолчанию"; еслизначение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполненообращение к функции, на которую указывает handler с типом сигнала в качестве аргумента. В числодопустимых видов сигналов входят:SIGABRT— аварийное завершение, например от abort;SIGFPE— арифметическая ошибка: деление на 0 или переполнение;SIGILL— неверный код функции (недопустимая команда);SIGINT— запрос на взаимодействие, например прерывание;SIGSEGV— неверный доступ к памяти, например выход за границы;SIGTERM— требование завершения, посланное в программу.signal возвращает предыдущее значение handler в случае специфицированного сигнала, илиSIGERR в случае возникновения ошибки.Когда в дальнейшем появляется сигнал sig, сначала восстанавливается готовность поведения "поумолчанию", после чего вызывается функция, заданная в параметре handler, т.е.
как бы выполняется вызов(*handler) (sig). Если функция handler вернет управление назад, то вычисления возобновятся с тогоместа, где застал программу пришедший сигнал.Начальное состояние сигналов зависит от реализации.int raise(int sig)raise посылает в программу сигнал sig. В случае неудачи возвращает ненулевое значение.В 10. Функции даты и времени: <time.h>Заголовочный файл <time.h> объявляет типы и функции, связанные с датой и временем. Некоторыефункции имеют дело с местным временем, которое может отличаться от календарного, например, в связи сзонированием времени.
Типы clock_t и time_t — арифметические типы для представления времени, astruct tm содержит компоненты календарного времени:int tm_sec;— секунды от начала минуты (0,61);int tm_min;— минуты от начала часа (0,59);int tm_hour;— часы от полуночи (0,23);int tmjnday;— число месяца (1,31);int tmjnon;— месяцы с января (0,11);int tm_year;— годы с 1900;int tm_wday;—дни с воскресенья (0,6);int tm_yday;— дни с 1 января (0,365);int tm_isdst;— признак летнего времени.Значение tm_isdst — положительное, если время приходится на сезон, когда время суток сдвинуто на 1 часвперед, нуль в противном случае и отрицательное, если информация не доступна.clock_t clock(void)clock возвращает время, фиксируемое процессором от начала выполнения программы, или -1, еслионо не известно.
Для выражения этого времени в секундах применяется формулаclock()/CLOCKS_PER_SEC.time_t time(time_t *tp)time возвращает текущее календарное время16 или -1, если время не известно. Если tp не равноNULL, то возвращаемое значение записывается и в *tp.double difftime(time_t time2, time_t timel)difftime возвращает разность time2-time1, выраженную в секундах.time_t mktime(struct tm «tp)mktime преобразует местное время, заданное структурой *tp, в календарное, выдавая его в том жевиде, что и функция time.
Компоненты будут иметь значения в указанных диапазонах. Функцияmktime возвращает календарное время или -1, если оно не представимо.Следующие четыре функции возвращают указатели на статические объекты, каждый из которых может бытьизменен другими вызовами.char *asctime(const struct tь *tp)asctime переводит время в структуре *tp в строку видаSun Jan 3 15:14:13 1988\n\0char *ctime(const time_t *tp)сtime переводит календарноеasctime(localtime(tp)).времявместное,чтоэквивалентновыполнениюstruct tm *gmtime(const time_t *tp)gmtime переводит календарное время во Всемирное координированное время (Coordinated UniversalTime — UTC). Выдает NULL, если UTC не известно. Имя этой функции, gmtime, происходит отGreenwich Mean Time (среднее время по Гринвичскому меридиану).struct tm *localtime(const time_t *tp)localtime переводит календарное время *tp в местное.size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp)strftime форматирует информацию о дате и времени из *tp в строку s согласно формату fmt,который имеет много общих черт с форматом, задаваемым в функции printf.
Обычные символы(включая и завершающий символ '\0') копируются в s. Каждая пара, состоящая из % и буквы,заменяется, как показано ниже, с использованием значений по форме, соответствующей местнымтрадициям. В s размещается не более smax символов, strftime возвращает число символов безучета '\0' или нуль, если число сгенерированных символов больше smax.16%асокращенное название дня недели%Аполное название дня неделиВремя, прошедшее после определенной даты, — обычно после 0 ч 00 мин 00 с GMT 1-го января 1970 г.
— Примеч. ред.%bсокращенное название месяца%Вполное название месяца.%сместное представление даты и времени%dдень месяца (01-31)%Нчас (24-часовое время) (00-23)%Iчас (12-часовое время) (01-12)%jдень от начала года (001-366)%mмесяц (01-12)%Мминута (00-59)%рместное представление AM или РМ (до или после полудня)%Sсекунда (00-61)%Uнеделя от начала года (считая, что воскресенье - 1-й день недели) (00-53)%wдень недели (0-6, номер воскресенья - 0)%Wнеделя от начала года (считая, что понедельник - 1 -и день недели) (00-53)%хместное представление даты%Хместное представление времени%yгод без указания века (00-99)%Yгод с указанием века%Zназвание временной зоны, если она есть%%%В 11.
Зависящие от реализации пределы: <limits.h> и <float.h>Заголовочный файл <limits.h> определяет константы для размеров целочисленных типов. Нижеперечислены минимальные приемлемые величины, но в конкретных реализациях могут использоваться ибольшие значения.CHAR_BIT8битов в значении charSCHAR_MAXUCHAR_MAXмаксимальное значение charили SCHAR_MAXCHAR_MIN0минимальное значение charили SCHAR_MININT_MAX+32767максимальное значение intINT_MIN-32767минимальное значение intLONG_MAX+2147463647максимальное значение longLONG_MIN-2147483647минимальное значение longSCHAR_MAX+127максимальное значение signed charSCHAR_MIN-127минимальное значение signed charSHRT_MAX+32767максимальное значение shortSHRT_MIN-32767минимальное значение shortUCHAR_MAX255максимальное значение unsigned charUINT_MAX65535максимальное значение unsigned intULONG_MAX4294967295максимальное значение unsigned longUSHRT_MAX65535максимальное значение unsigned shortИмена, приведенные в следующей таблице, взяты из <float.h> и являются константами, имеющимиотношение к арифметике с плавающей точкой.
Значения (если они есть) представляют собой минимальныезначения для соответствующих величин. В каждой реализации устанавливаются свои значения.FLT_RADIX2FLT_ROUNDSспособ округления при сложении чисел с плавающей точкойFLT_DIG6FLT_EPSILON1E-5FLT_MANT_DIGFLT_MAXминимальное х, такое, что 1.0 + х 1.0количество цифр по основанию FLT_RADIX в мантиссе1E+37FLT_MAX_EXPFLT_MINоснование для представления порядка, например: 2, 16максимальное число с плавающей точкоймаксимальное n, такое, что FLT_RADIXn-1 представимо1E-37FLT_MIN_EXPминимальное нормализованное число с плавающей точкойминимальное n, такое,нормализованного числачто10nпредставимовDBL_DIG10количество верных десятичных цифр для типа doubleDBL_EPSILON1E-9минимальное х, такое, что 1.0 + х 1.0, где х принадлежит типуdoubleDBL_MANT DIGDBL_MAXDBL_MAX_EXPвидеколичество цифр по основанию FLT_RADIX в мантиссе для чиселтипа double1E+37максимальное число с плавающей точкой типа doubleмаксимальное n, такое, что FLT_RADIXn -1 представимо в видечисла типа doubleDBL_MINDBL_MIN_EXP1E-37минимальное нормализованное число с плавающей точкой типаdoubleминимальное n, такое, что 10nнормализованного числа типа doubleпредставимоввидеC.















