


Справочные материалы 877
Продолжение табл. Б.\(.36


Справочные материалы 879
Окончание табл. B.V.36

_Noreturn: stdnoreturn.h
Это определяет макрос noreturn, который расширяется до _Noreturn.
Обработка строк: string.h
В заголовочном файле string.h определен тип size_t и макрос NULL для нулевого указателя. Кроме того, предлагается ряд функций для анализа и манипулирования символьными строками, а также несколько функций, работающих с памятью более универсальным способом. Эти функции перечислены в табл. B.V.37.
Таблица 6.V.37. Строковые функции


Справочные материалы 881
Окончание табл. B.V.37

Функция strtok() применяется несколько необычно, поэтому рассмотрим небольшой пример:
#include
#include
int main(void)
{
char data[] = " С приносит\t очень#много\nрадости!"; const char tokseps[] = " \t\n#"; /* разделители */
char * pt;
puts(data);
pt = strtok(data,tokseps); /* первый вызов */
while (pt) /* выход в случае NULL */
{
puts (pt); /* показать лексему */
pt = strtok(NULL, tokseps); /* следующая лексема */
}
return 0;
}
882 Приложение Б
Вот вывод, полученный в результате запуска этого примера:
С приносит очень#много радости!
С
приносит очень много радости!
Математические функции для обобщенных типов:
tgmath.h (С99)
Библиотеки math.h и complex.h предоставляют множество экземпляров функций, которые отличаются только типами. Например, все шесть функций, показанные ниже, вычисляют синус:
double sin(double);
float sinf(float);
long double sinlllong double);
double complex csin(double complex);
float csinf(float complex);
long double csinlllong double complex);
В заголовочном файле tgmath.h определены макросы, которые расширяют обобщенный вызов в обращение к соответствующей функции, как указано типом аргумента. Следующий код иллюстрирует использование макроса sin(), расширяемого в различные формы функции синуса:

В этом заголовочном файле определены обобщенные макросы для трех классов функций. Первый класс состоит из функций math.h и complex.h, определенных в тести вариациях, в которых применяются суффиксы f и 1 и префикс с, как в предыдущем примере с sin(). В данном случае обобщенный макрос носит то же имя, что и версия double функции.
Во второй класс входят функции math.li, определенные в трех вариациях с использованием суффиксов f и 1, которые не имеют комплексных аналогов, к примеру, erf(). В этом случае имя макроса выглядит так же, как имя функции без суффикса, в рассматриваемом примере — erf(). Результат применения такого макроса с комплексным аргументом не определен.
Третий класс состоит из функций complex.h, которые определены в трех вариациях с использованием суффиксов f и 1 и не имеют вещественных аналогов, таких как cimag(). В данном случае имя макроса совпадает с именем функции без суффикса, в этом примере — cimag(). Результат применения такого макроса с вещественным аргументом не определен.
В табл. B.V.38 перечислены обобщенные функциональные макросы.
Справочные материалы 883
Таблица 6.V.38. Обобщенные математические функции

До выхода стандарта С11 для определения обобщенных макросов реализации должны были прибегать к расширениям стандарта. Но добавление выражения _Generic делает возможной прямую реализацию с использованием стандарта СИ.
ПОТОКИ: threads.h (С11)
Заголовочный файл threads.h наряду с stdatomic.h предоставляет поддержку для параллельного программирования. Эта тема выходит за рамки настоящей книги, но, выражаясь общими терминами, данный заголовочный файл поддерживает множество потоков выполнения, которые в принципе могут быть назначены разным процессорам.
Читать дальше