Если выражение имеет значение нуль, то
assert ( выражение )
напечатает в stderr сообщение следующего вида:
Assertion failed: выражение , file имя-файла , line nnn
после чего будет вызвана функция abort , которая завершит вычисления. Имя исходного файла и номер строки будут взяты из макросов __FILE__ и __LINE__.
Если в момент включения файла было определено имя NDEBUG, то макрос assert игнорируется.
B7. Списки аргументов переменной длины:
Заголовочный файл предоставляет средства для перебора аргументов функции, количество и типы которых заранее не известны. Пусть lastarg - последний именованный параметр функции f с переменным числом аргументов. Внутри f объявляется переменная ap типа va_list, предназначенная для хранения указателя на очередной аргумент:
va_list ар;
Прежде чем будет возможен доступ к безымянным аргументам, необходимо один раз инициализировать ap , обратившись к макросу va_start:
va_start(va_list ap, lastarg);
С этого момента каждое обращение к макросу:
type va_arg(va_list ap, type);
будет давать значение очередного безымянного аргумента указанного типа, и каждое такое обращение будет вызывать автоматическое приращение указателя ap , чтобы последний указывал на следующий аргумент. Один раз после перебора аргументов, но до выхода из f необходимо обратиться к макросу
void va_end(va_list ap);
Объявления в предоставляют способ отклониться от обычной последовательности "вызов - возврат"; типичная ситуация - необходимость вернуться из "глубоко вложенного" вызова функции на верхний уровень, минуя промежуточные возвраты.
int setjmp(jmp_buf env);
Макрос setjmpсохраняет текущую информацию о вызовах в env для последующего ее использования в longjmp. Возвращает нуль, если возврат осуществляется непосредственно из setjmp , и не нуль, если - от последующего вызова longjmp . Обращение к setjmp возможно только в определенных контекстах, в основном это проверки в if , switсh и циклах, причем только в простых выражениях отношения.
if (setjmp() == 0)
/* после прямого возврата */
else
/* после возврата из longjmp */
void longjmp(jmp_buf env, int val);
longjmpвосстанавливает информацию, сохраненную в самом последнем вызове setjmp , по информации из env ; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val . Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызов setjmp , уже "отработала" и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp ; setjmp не сохраняет значений.
Заголовочный файл предоставляет средства для обработки исключительных ситуаций, возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником или ошибкой в вычислениях.
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 вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации.
Читать дальше