Руководство по использованию библиотек с

Основные библиотеки в Си

В языке Си стандартные функции собраны в различных библиотеках. Для использования
этих функций необходимо подключить к проекту соответствующие библиотеки с помощью конструкции #include. Например, #include<stdio.h>

Названия библиотек и их свойства

stdio.h Библиотека ввода-вывода.
stdlib.h Вспомогательные функции, которые могут быть использованы в разнообразных программах
math.h Математическая библиотека.
string.h Работа с строками(массивами символов).
time.h Функции по работе с датами и временем, в том числе текущим.

Составы библиотек

Состав stdio.h

Функции для файловых операций:

Имя функции Описание
fclose закрывает файл, ассоциированный с переданным ей значением FILE *
fopen, freopen, fdopen открывают файл для определенных типов чтения и записи
remove удаляет файл (стирая его)
rename переименовывает файл
rewind работает аналогично fseek(stream, SEEK_SET), вызванному для потока, со сбросом индикатора ошибок
tmpfile создает и открывает временный файл, удаляемый при закрытии через fclose()

Функции для операций ввода-вывода:

clearerr очищает eof и индикаторы ошибок для данного потока
feof проверяет, установлен ли индикатор eof для данного потока
ferror проверяет, установлен ли индикатор ошибок для данного потока
fflush принудительно записывает вывод, предназначенный для помещения в буфер, в файл, ассоциированный с данным потоком
fgetpos сохраняет позицию указателя файла потока, ассоциированный с его первым аргументом (file *), в его второй аргумент (fpos_t *)
fgetc возвращает один символ из файла
fgets получает строку из файла (оканчивающуюся символом перевода строки или конца файла)
fputc записывает один символ в файл
fputs записывает строку в файл
ftell возвращает указатель позиции файла, который может быть передан fseek
fseek производит поиск по файлу
fsetpos устанавливает указатель позиции файла потока, ассоциированный с его первым аргументом (file *), как хранимый во втором его аргументе (fpos_t *)
fread читает данные из файла
fwrite записывает данные в файл
getc считывает и возвращает символ из данного потока и изменяет укащатель позиции файла; позволяет использоваться как макрос с теми же эффектами, что и fgetc, кроме того, что может вычислять поток более одного раза
getchar имеет аналогичный эффект, что и getc(stdin)
gets считывает символы из stdin до символа перевода строки и хранит их в своем единственном аргументе
printf, vprintf используются для вывода в стандартный поток вывода
fprintf, vfprintf используются для вывода в файл
sprintf, snprintf, vsprintf используются для вывода в массив типа char (строка в языке си)
perror записывает сообщение об ошибке в stderr
putc записывает и возвращает символ в поток и изменяет указатель позиции файла на него; можно использовать как макрос с теми же свойствами, что и fputc, кроме того, что он может обрабатывать поток более одного раза
putchar, fputchar аналогичны putc(stdout)
scanf, vscanf используются для ввода из стандартного потока ввода
fscanf, vfscanf используются для ввода из файла
sscanf, vsscanf используются для ввода из массива char (то есть строка в языке си)
setvbuf устанавливает режим буферизации для данного потока
tmpnam создает временное имя файла
ungetc помещает символ обратно в поток
puts выводит символьную строку в stdout

Состав библиотеки stdlib.h

имя функции описание
abort ненормальное завершение программы
abs модуль целого числа
assert макроопределение для вывода отладочных диагностических сообщений
atexit запрос вызова функции при завершении работы программы
atof, atoff преобразование строки в значение типа double или float
atii, atol строка в целое
atol преобразовывает строку в long
bsearsh двоичный поиск
calloc выделяет пространство для массивов
div деление двух целых
ecvt, ecvtf, fcvt, fcvtf преобразование double или float в строку
gvcvt, gcvtf форматируют double и float как строку
ecvtbuf, fcvtbuf double или float в строку
exit завершение выполнения программы
getenv поиск переменной окружения
labs модуль длинного целого
ldiv деление двyх длинных целых
malloc, realloc, free управление памятью
mbtowc минимальный преобразователь мультибайтов в широкие символы
qsort сортировка массива
rand, srand псевдо-случайные числа
strtod, strtodf строка в double или float
strtol строка в long
strtoul строка в unsigned long
system выполняет командную строку
wctomb минимальный преобразователь широких символов в мультибайты

Состав библиотеки math.h

имя функции описание
acos арккосинус
asin арксинус
atan арктангенс
atan2 арктангенс с двумя параметрами
ceil округление до ближайшего большего целого числа
cos косинус
cosh гиперболический косинус
exp вычисление экспоненты
fabs абсолютная величина (числа с плавающей точкой)
floor округление до ближайшего меньшего целого числа
fmod вычисление остатка от деления нацело для чисел с плавающей точкой
frexp разбивает число с плавающей точкой на мантиссу и показатель степени.
ldexp умножение числа с плавающей точкой на целую степень двух
log натуральный логарифм
log10 логарифм по основанию 10
modf(x,p) извлекает целую и дробную части (с учетом знака) из числа с плавающей точкой
pow(x,y) результат возведения x в степень y, xy
sin синус
sinh гиперболический синус
sqrt квадратный корень
tan тангенс
tanh гиперболический тангенс

Состав библиотеки string.h

имя функции описание
void *memcpy(void *dest, const void *src, size_t n); копирует n байт из области памяти src в dest, которые не должны пересекаться, в противном случае результат неопределен (возможно как правильное копирование, так и нет)
void *memmove(void *dest, const void *src, size_t n); копирует n байт из области памяти src в dest, которые в отличие от memcpy могут перекрываться
void *memchr(const void *s, char c, size_t n); возвращает указатель на первое вхождение c в первых n байтах s, или null, если не найдено
int memcmp(const void *s1, const void *s2, size_t n); сравнивает первые n символов в областях памяти
void *memset(void *, int z, size_t); заполняет область памяти одним байтом z
char *strcat(char *dest, const char *src); дописывает строку src в конец dest
char *strncat(char *, const char *, size_t); дописывает не более n начальных симолов строки src (или всю src, если ее длина меньше) в конец dest
char *strchr(const char *, int); ищет символ в строке, начиная с головы и возращает его адрес, или null если не найден
char *strrchr(const char *, int); ищет символ в строке, начиная с хвоста и возращает его адрес, или null если не найден
int strcmp(const char *, const char *); лексикографическое сравнение строк
int strncmp(const char *, const char *, size_t); лексикографическое сравнение первых n байтов строк
int strcoll(const char *, const char *); лексикографическое сравнение строк с учетом локали collating order
char *strcpy(char *tohere, const char *fromhere); копирует строку из одного места в другое
char *strncpy(char *tohere, const char *fromhere, size_t); копирует до n байт строки из одного места в другое
char *strerror(int); возвращает строковое представление сообщения об ошибке errno (не потоко-безопасная)
size_t strlen(const char *); возвращает длину строки
size_t strspn(const char *s, const char *accept); определяет максимальную длину начальной подстроки, состоящей исключительно из байтов, перечисленных в accept
size_t strcspn(const char *s, const char *reject); определяет максимальную длину начальной подстроки, состоящей исключительно из байтов, не перечисленных в reject
char *strpbrk(const char *s, const char *accept); находит первое вхождение любого символа, не перечисленного в accept
char *strstr(const char *haystack, const char *needle); находит первое вхождение строки needle в haystack
char *strtok(char *, const char *); преобразует строку в последовательность токенов. не потоко-безопасная, нереентрантная.
size_t strxfrm(char *dest, const char *src, size_t n); создает оттранслированную копию строки, такую, что дословное сравнение ее (strcmp) будет эквивалентно сравнению с коллатором.

Библиотеки

Библиотеки позволяют использовать разработанный ранее программный код в различных программах. Таким образом, программист может не разрабатывать часть кода для своей программы, а воспользоваться тем, что входит в состав библиотек.

В языке программирования C код библиотек представляет собой функции, размещенные в файлах, которые скомпилированы в объектные файлы, а те, в свою очередь, объединены в библиотеки. В одной библиотеке объединяются функции, решающие определенный тип задач. Например, существует библиотека математических функций.

У каждой библиотеки должен быть свой заголовочный файл, в котором должны быть описаны прототипы (объявления) всех функций, содержащихся в этой библиотеке. С помощью заголовочных файлов вы «сообщаете» вашему программному коду, какие библиотечные функции есть и как их использовать.

При компиляции программы библиотеки подключаются линковщиком, который вызывается gcc. Если программе требуются только стандартные библиотеки, то дополнительных параметров линковщику передавать не надо (есть исключения). Он «знает», где стандартные библиотеки находятся, и подключит их автоматически. Во всех остальных случаях при компиляции программы требуется указать имя библиотеки и ее местоположение.

Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.

Далее будет описан пример, в котором создается библиотека, после чего используется при создании программы.

Пример создания библиотеки

Допустим, мы хотим создать код, который в дальнейшем планируем использовать в нескольких проектах. Следовательно, нам требуется создать библиотеку. Исходный код для библиотеки было решено разместить в двух файлах исходного кода.
Также на данный момент у нас есть план первого проекта, использующего эту библиотеку. Сам проект также будет включать два файла.

В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая (libmy1.a) и динамическая (libmy2.so) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.
В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс «lib», статические библиотеки — расширение *.a, динамические — *.so.

Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны (libmy1 и libmy2).

Исходный код библиотеки

Файл figure.c:

void rect(char sign, int w, int h) {
    int i, j;
 
    for (i=0; i < w; i++) 
        putchar(sign);
    putchar('\n');
 
    for (i=0; i < h-2; i++) {
        for (j=0; j < w; j++) {
            if (j == 0 || j == w-1) 
                putchar(sign);
            else 
                putchar(' ');      
        }
        putchar('\n');
    }
 
    for (i=0; i < w; i++) 
        putchar(sign);
    putchar('\n');
}
 
void diagonals(char sign, int w) {
    int i, j;
 
    for (i=0; i < w; i++) {
        for (j=0; j < w; j++) {
            if (i == j || i+j == w-1) 
                putchar(sign);
            else 
                putchar(' ');      
        }
        putchar('\n');
    }
}

В файле figure.c содержатся две функции — rect() и diagonals(). Первая принимает в качестве аргументов символ и два числа и «рисует» на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата («рисует» крестик).

Файл text.c:

void text(char *ch) {
    while (*ch++ != '\0') 
        putchar('*');
    putchar('\n');
}

В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

Файл mylib.h:

void rect(char sign, int width, int height);
void diagonals(char sign, int width);
void text(char *ch);
 

Заголовочный файл можно создать в каталоге source, но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

Создание статической библиотеки

Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.

Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l.

Получаем объектные файлы:

gcc -c ./source/*.c

В итоге в каталоге library должно наблюдаться следующее:

figures.o  mylib.h  source  text.o

Далее используем утилиту ar для создания статической библиотеки:

ar r libmy1.a *.o

Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

Объектные файлы нам не нужны, поэтому их можно удалить:

rm *.o

В итоге содержимое каталога library должно выглядеть так:

libmy1.a  mylib.h  source

, где libmy1.a — это статическая библиотека.

Создание динамической библиотеки

Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc:

gcc -c -fPIC source/*.c

В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared:

gcc -shared -o libmy2.so *.o

Использованные объектные файлы можно удалить:

rm *.o

В итоге содержимое каталога library:

libmy1.a  libmy2.so  mylib.h  source

Использование библиотеки в программе

Исходный код программы

Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

Файл data.c:

#include <stdio.h>
#include "../library/mylib.h"
 
void data (void) {
    char strs[3][30];
    char *prompts[3] = {
        "Ваше имя: ", 
        "Местонахождение: ", 
        "Пунк прибытия: "};
    int i;
 
    for (i=0; i<3; i++) {
        printf("%s", prompts[i]);
        gets(strs[i]);
    }
 
    diagonals('~', 7);
 
    for (i=0; i<3; i++) {
        printf("%s", prompts[i]);
        text(strs[i]);
    }
}
 

Функция data() запрашивает у пользователя данные, помещая их в массив strs. Далее вызывает библиотечную функцию diagonals(), которая выводит на экране «крестик». После этого на каждой итерации цикла вызывается библиотечная функция text(), которой передается очередной элемент массива; функция text() выводит на экране звездочки в количестве равному длине переданной через указатель строки.

Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т.е. родительский по отношению к project, после чего путь продолжается во вложенный в родительский каталог library. Можно было бы указать абсолютный путь, например, «/home/pl/c/les22/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

Файл main.c:

#include <stdio.h>
#include "../library/mylib.h"
#include "project.h"
 
int main() {
    rect('-',75,4);
    data();
    rect('+',75,3);
}
 

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main() прототип data() также подключается заголовочный файл проекта.

Файл project.h содержит всего одну строчку:

void data(void);

Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:

gcc -c *.c

При этом не забудьте сделать каталог project текущим!

Компиляция проекта со статической библиотекой

Теперь в каталоге project есть два объектных файла: main.o и data.o. Их надо скомпилировать в исполняемый файл project, объединив со статической библиотекой libmy1.a. Делается это с помощью такой команды:

gcc -o project *.o -L../library -lmy1

Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.

Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1. Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so) усекаются. Обратите внимание, что после данных опций пробел не ставится.

Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/, /urs/lib/ и др.

Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

Посмотрим размер файла project:

pl@desk:~/c/project$ ls -l project
-rwxr-xr-x 1 pl pl 8648 ноя 19 07:46 project

Его размер равен 8698 байт.

Компиляция проекта с динамической библиотекой

Теперь удалим исполняемый файл и получим его уже связанным с динамической библиотекой. Команда компиляции с динамической библиотекой выглядит так (одна команда разбита на две строки с помощью обратного слэша и перехода на новую строку):

gcc -o project *.o \
> -L../library -lmy2 -Wl,-rpath,../library/

Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath,../library/. -Wl — это обращение к линковщику, -rpath — опция линковщика, ../library/ — значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L, а второй раз с опцией -rpath. Видимо для того, чтобы понять, почему так следует делать, потребуется более основательно изучить процесс компиляции и компоновки программ на языке C.

Следует заметить, что если вы скомпилируете программу, используя приведенную команду, то исполняемый файл будет запускаться из командной строки только в том случае, если текущий каталог project. Стоит сменить каталог, будет возникать ошибка из-за того, что динамическая библиотека не будет найдена. Но если скомпилировать программу так:

gcc -o project *.o -L../library -lmy2 \
> -Wl,-rpath,/home/pl/c/library

, т.е. указать для линковщика абсолютный адрес, то программа в данной системе будет запускаться из любого каталога.

Размер исполняемого файла проекта, связанного с динамической библиотекой, получился равным 8544 байта. Это немного меньше, чем при компиляции проекта со статической библиотекой. Если посмотреть на размеры библиотек:

pl@desk:~/c/library$ ls -l libmy*
-rw-r--r-- 1 pl pl 3712 ноя 19 07:35 libmy1.a
-rwxr-xr-x 1 pl pl 7896 ноя 19 07:36 libmy2.so

, то видно, что динамическая больше статической, хотя исполняемый файл проекта со статической библиотекой больше. Это доказывает, что в исполняемом файле, связанном с динамической библиотекой, присутствует лишь ссылка на нее.

Курс с решением части задач:
pdf-версия

Тайные знания: библиотеки для С++

Время на прочтение
5 мин

Количество просмотров 26K

Рун не должен резать
Тот, кто в них не смыслит.
В непонятных знаках
Всякий может сбиться.
(Сага об Эгиле)

Многие начинающие программисты, уже освоив синтаксис C++, обнаруживают, что нет простого способа как подключить библиотеку, так и собрать программу для другой ОС, или чего хуже, под другим компьютером с той же ОС.
Это проблема отчасти порождается спорной практикой в обучении, когда код учат писать и запускать средствами IDE, таких как Visual Studio, Code::Blocks, и других. Поначалу такой подход работает, но лишь до первой реальной задачи сделать что-то, что запустится не только на вашем компьютере. Тут-то новички и сталкиваются с отсутствием стандартной системы сборки и менеджера зависимостей. После осознания этой сложности, большинство студентов, как правило, переходят на другие языки, попутно тиражируя в индустрии миф о том, что C++ де не кроссплатформенный язык, а вот мой Python/Java/C# — да. Между тем нас окружает множество замечательных кроссплатформенных программ написанных на C++. Если вы обучаетесь C++ и хотите понять как создавать такое ПО, то эта статья для вас.

1. Минутка теории. Получение исполняемого файла всегда и везде, зачем это необходимо?

Если вы читаете эту статью, то наверное, отдалено уже понимаете, что преобразует код компилятор (а склеивает в один исполнямый файл линковщик), но на практике, скорее всего до сих пор не сталкивались с этим, запуская сборку в один исполняемый файл сразу из IDE. Возможно вы вообще не пробовали собрать программу в файл, запуская её красивой зелененькой кнопочкой Run.
Однако и сама IDE, в свою очередь, не собирает и не запускает ваш код, а лишь вызывает специальную программу, которая называется система сборки, или сборщик, который-то и отвечает за сборку проекта и взаимодействие с компилятором и линковщиком.

У Visual Studio, к примеру, сборщиком по умолчанию является MSBuild, а у CLion — CMake. Те дополнительные файлы, которые вы видите, создав новый проект через интерфейс IDE, и являются конфигурацией для системы сборки. Наша задача просто научиться взаимодействовать с ней напрямую. Для этого мы возьмем CMake, потому что в отличие от MSBuild, эта система сборки запускается на большинстве ОС.

Почему надо разобраться в конфигурации системы сборки? Разве мне недостаточно среды, спросите вы? Потому что ваша среда может запуститься не везде, а система сборки гораздо более переносима, с ней вы сможете автоматизировать сборку, использовать контейнеры Docker, сможете оставить в репозитории билд скрипт который соберет ваш код на любом компьютере — ну разве не круто?

2. Пишем конфигурацию сборки самостоятельно

Итак, пришло время выйти из уютного мира в IDE, и вступить на путь уже кроссплатформенной стрельбы себе в ногу. Прежде всего, убедитесь что ваш код использует только стандартные функции С++. Если он вызывает ОС-зависимые API, вроде #include <Windows.h>, то рассмотрите чем их можно заменить. После этого воспользуемся следующим шаблоном CMake и создадим новый файл CMakeLists.txt:

cmake_minimum_required(VERSION 3.18)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Подключаем менеджер зависимостей Conan
list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})
if (NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
    message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
    file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.16.1/conan.cmake"
            "${CMAKE_BINARY_DIR}/conan.cmake"
            EXPECTED_HASH SHA256=396e16d0f5eabdc6a14afddbcfff62a54a7ee75c6da23f32f7a31bc85db23484
            TLS_VERIFY ON)
endif ()
include(${CMAKE_BINARY_DIR}/conan.cmake)

# Подключаем репозиторий зависимостей https://conan.io
conan_add_remote(NAME conan-center INDEX 1 URL https://center.conan.io VERIFY_SSL True)

# Скачиваем нужные нам зависимости, например:
conan_cmake_configure(REQUIRES catch2/2.13.6 spdlog/1.8.5 threadpool/20140926 simdjson/0.9.6 icu/69.1 GENERATORS cmake_find_package)
conan_cmake_autodetect(settings)
conan_cmake_install(PATH_OR_REFERENCE . BUILD missing REMOTE conan-center SETTINGS ${settings})

# Делаем зависимости видимыми для CMake
find_package(Catch2) # фреймворк тестирования
find_package(ICU) # работа с юникодом
find_package(spdlog) # логирование
find_package(simdjson) # парсинг json с помощью simd
find_package(ThreadPool) # ThreadPoolExecutor

# Подключаем файлы с основным кодом
file(GLOB proj_sources src/*.cpp)
add_executable(app ${proj_sources})

# Линкуем зависимости для основного кода (имена для линковки можно вытащить из описания зависимостей)
target_link_libraries(app PRIVATE ThreadPool::ThreadPool spdlog::spdlog simdjson::simdjson ICU::io ICU::i18n ICU::uc ICU::data)

# Подключаем файлы с кодом тестов
list(FILTER proj_sources EXCLUDE REGEX ".*/Main.cpp$")
file(GLOB test_sources test/*.cpp)
add_executable(test ${proj_sources} ${test_sources})

# Линкуем зависимости для тестов
target_link_libraries(test PRIVATE Catch2::Catch2 ThreadPool::ThreadPool spdlog::spdlog simdjson::simdjson ICU::io ICU::i18n ICU::uc ICU::data)

В этом шаблоне задаётся практически все, что нужно вам для сборки:

  1. Устанавливается стандарт C++20

  2. Подключается репозиторий библиотек Conan

  3. Задается соглашение, что файлы с кодом (.cpp, .h) будут лежать в папке src.

  4. Задается соглашение, что файлы с кодом для тестов будут лежать в паке test.

  5. Задаётся соглашение, что точки входа (int main) будут лежать в файлах Main.cpp

Убедитесь что ваш код хранится по этим соглашениям.
В скрипте также сразу подключается для примера несколько библиотек, по аналогии, следуя комментариям, вы можете добавить нужные вам.
Искать их можно тут: conan.io.

3. Как теперь собрать наше приложение в файл?

Мы отказались от кнопочек IDE в пользу более могущественного скрипта. Теперь нам понадобится платформа GCC или LLVM (возможно они уже есть на вашем компьютере), установленная система сборки CMake и менеджер зависимостей Conan. Их легко установить при помощи пакетного менеджера вашей ОС, или вручную, с официальных сайтов.

Откройте терминал в папке, где лежит CMakeLists.txt. Сначала нужно подготовить make-файлы. Воспринимайте это как предварительное действие:

cmake -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -B bin

После этого можно собрать само приложение и тесты:

cmake --build bin --target all

Приложение будет расположено в директории bin в файле под именем app.
Тесты могут быть запущены при помощи отдельного файла test в той же директории.

Вот и всё! Не так уж сложно, правда? Теперь вы можете распространять свое ПО на разные ОС, легко собирать его и подключать библиотеки. Если вы попробовали и что-то не работает, или есть какие-то вопросы, то их можно задать в комментариях под этой статьёй, постараюсь ответить.

После того как вы разберетесь как это делать, можно пользоваться моим project-wizard’ом для создания кроссплатформенных C++ утилит и библиотек в один клик: github.com/demidko
Однако сперва рекомендую попробовать воспроизвести результат самостоятельно, для лучшего понимания, что именно вы делаете, ведь в процессе приходят осознание и навык.

Давайте скомпилируем и запустим вышеуказанную программу, которая даст следующий результат –

Заголовок limit.h определяет различные свойства различных типов переменных. Макросы, определенные в этом заголовке, ограничивают значения различных типов переменных, таких как char, int и long.

Эти ограничения указывают на то, что переменная не может хранить любое значение за пределами этих ограничений, например, беззнаковый символ может хранить до максимального значения 255.

Следующие значения зависят от реализации и определяются с помощью директивы #define, но эти значения могут быть не ниже указанных здесь.

В следующем примере показано использование нескольких констант, определенных в файле limit.h .

#include <stdio.h>
#include <limits.h>

int main() {

   printf("The number of bits in a byte %d\n", CHAR_BIT);

   printf("The minimum value of SIGNED CHAR = %d\n", SCHAR_MIN);
   printf("The maximum value of SIGNED CHAR = %d\n", SCHAR_MAX);
   printf("The maximum value of UNSIGNED CHAR = %d\n", UCHAR_MAX);

   printf("The minimum value of SHORT INT = %d\n", SHRT_MIN);
   printf("The maximum value of SHORT INT = %d\n", SHRT_MAX); 

   printf("The minimum value of INT = %d\n", INT_MIN);
   printf("The maximum value of INT = %d\n", INT_MAX);

   printf("The minimum value of CHAR = %d\n", CHAR_MIN);
   printf("The maximum value of CHAR = %d\n", CHAR_MAX);

   printf("The minimum value of LONG = %ld\n", LONG_MIN);
   printf("The maximum value of LONG = %ld\n", LONG_MAX);
  
   return(0);
}

Давайте скомпилируем и запустим вышеуказанную программу, которая даст следующий результат –

The maximum value of UNSIGNED CHAR = 255                                    
The minimum value of SHORT INT = -32768                                     
The maximum value of SHORT INT = 32767                                      
The minimum value of INT = -2147483648                                      
The maximum value of INT = 2147483647                                       
The minimum value of CHAR = -128                                            
The maximum value of CHAR = 127                                             
The minimum value of LONG = -9223372036854775808                            
The maximum value of LONG = 9223372036854775807

Библиотека C – <locale.h>

Заголовок locale.h определяет специфичные для местоположения настройки, такие как форматы даты и символы валюты. Вы найдете несколько макросов, определенных вместе с важной структурой struct lconv и двумя важными функциями, перечисленными ниже.

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке, и эти макросы будут использоваться в двух функциях, перечисленных ниже:

Sr.No. Макрос и описание
1

LC_ALL

Устанавливает все.

2

LC_COLLATE

Влияет на функции strcoll и strxfrm.

3

LC_CTYPE

Влияет на все функции персонажа.

4

LC_MONETARY

Влияет на денежную информацию, предоставляемую функцией localeconv.

5

LC_NUMERIC

Влияет на форматирование десятичной точки и информацию, предоставляемую функцией localeconv.

6

LC_TIME

Влияет на функцию strftime.

LC_ALL

Устанавливает все.

LC_COLLATE

Влияет на функции strcoll и strxfrm.

LC_CTYPE

Влияет на все функции персонажа.

LC_MONETARY

Влияет на денежную информацию, предоставляемую функцией localeconv.

LC_NUMERIC

Влияет на форматирование десятичной точки и информацию, предоставляемую функцией localeconv.

LC_TIME

Влияет на функцию strftime.

Функции библиотеки

Ниже приведены функции, определенные в заголовке locale.h –

Sr.No. Описание функции
1 char * setlocale (категория int, const char * locale)

Устанавливает или читает информацию, зависящую от местоположения.

2 struct lconv * localeconv (void)

Устанавливает или читает информацию, зависящую от местоположения.

Устанавливает или читает информацию, зависящую от местоположения.

Устанавливает или читает информацию, зависящую от местоположения.

Структура библиотеки

typedef struct {
   char *decimal_point;
   char *thousands_sep;
   char *grouping;	
   char *int_curr_symbol;
   char *currency_symbol;
   char *mon_decimal_point;
   char *mon_thousands_sep;
   char *mon_grouping;
   char *positive_sign;
   char *negative_sign;
   char int_frac_digits;
   char frac_digits;
   char p_cs_precedes;
   char p_sep_by_space;
   char n_cs_precedes;
   char n_sep_by_space;
   char p_sign_posn;
   char n_sign_posn;
} lconv

Ниже приводится описание каждого из полей –

Sr.No. Поле и описание
1

десятичная точка

Десятичный знак, используемый для неденежных значений.

2

thousands_sep

Символ разделителя тысяч используется для неденежных значений.

3

группировка

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

4

int_curr_symbol

Это строка используемых международных символов валюты. Первые три символа – это те, которые определены ISO 4217: 1987, а четвертый – символ, который отделяет символ валюты от денежного количества.

5

символ валюты

Местный символ используется для валюты.

6

mon_decimal_point

Символ десятичной точки, используемый для денежных значений.

7

mon_thousands_sep

Символ группирования тысяч, используемый для денежных значений.

8

mon_grouping

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

9

positive_sign

Символ используется для положительных денежных значений.

10

negative_sign

Символ, используемый для отрицательных денежных значений.

11

int_frac_digits

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

12

frac_digits

Количество цифр после десятичной запятой в денежных значениях.

13

P_cs_precedes лемент

Если равно 1, то currency_symbol появляется перед положительным денежным значением. Если равно 0, то currency_symbol появляется после положительного денежного значения.

14

p_sep_by_space

Если равно 1, то currency_symbol отделяется пробелом от положительного денежного значения. Если равно 0, то между currency_symbol и положительным денежным значением нет пробела.

15

n_cs_precedes

Если равно 1, то currency_symbol предшествует отрицательному денежному значению. Если равно 0, то currency_symbol следует отрицательное денежное значение.

16

n_sep_by_space

Если равно 1, то currency_symbol отделяется пробелом от отрицательного денежного значения. Если равно 0, то между currency_symbol и отрицательным денежным значением нет пробела.

17

p_sign_posn

Представляет позицию positive_sign в положительном денежном выражении.

18

n_sign_posn

Представляет позицию отрицательного знака в отрицательном денежном выражении.

десятичная точка

Десятичный знак, используемый для неденежных значений.

thousands_sep

Символ разделителя тысяч используется для неденежных значений.

группировка

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

int_curr_symbol

Это строка используемых международных символов валюты. Первые три символа – это те, которые определены ISO 4217: 1987, а четвертый – символ, который отделяет символ валюты от денежного количества.

символ валюты

Местный символ используется для валюты.

mon_decimal_point

Символ десятичной точки, используемый для денежных значений.

mon_thousands_sep

Символ группирования тысяч, используемый для денежных значений.

mon_grouping

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

positive_sign

Символ используется для положительных денежных значений.

negative_sign

Символ, используемый для отрицательных денежных значений.

int_frac_digits

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

frac_digits

Количество цифр после десятичной запятой в денежных значениях.

P_cs_precedes лемент

Если равно 1, то currency_symbol появляется перед положительным денежным значением. Если равно 0, то currency_symbol появляется после положительного денежного значения.

p_sep_by_space

Если равно 1, то currency_symbol отделяется пробелом от положительного денежного значения. Если равно 0, то между currency_symbol и положительным денежным значением нет пробела.

n_cs_precedes

Если равно 1, то currency_symbol предшествует отрицательному денежному значению. Если равно 0, то currency_symbol следует отрицательное денежное значение.

n_sep_by_space

Если равно 1, то currency_symbol отделяется пробелом от отрицательного денежного значения. Если равно 0, то между currency_symbol и отрицательным денежным значением нет пробела.

p_sign_posn

Представляет позицию positive_sign в положительном денежном выражении.

n_sign_posn

Представляет позицию отрицательного знака в отрицательном денежном выражении.

Следующие значения используются для p_sign_posn и n_sign_posn

Значение Описание
0 Круглые скобки заключают в себе значение и currency_symbol.
1 Знак предшествует значению и currency_symbol.
2 Знак следует за значением и currency_symbol.
3 Знак непосредственно предшествует значению и currency_symbol.
4 Знак сразу следует за значением и currency_symbol.

Библиотека C – <math.h>

Заголовок math.h определяет различные математические функции и один макрос. Все функции, доступные в этой библиотеке, принимают аргумент double и возвращают результат double .

Макросы библиотеки

В этой библиотеке определен только один макрос –

Sr.No. Макрос и описание
1

HUGE_VAL

Этот макрос используется, когда результат функции не может быть представлен в виде числа с плавающей запятой. Если величина правильного результата слишком велика для представления, функция устанавливает значение errno на ERANGE, чтобы указать ошибку диапазона, и возвращает конкретное, очень большое значение, названное макросом HUGE_VAL или его отрицанием (- HUGE_VAL).

Если величина результата слишком мала, вместо этого возвращается нулевое значение. В этом случае errno может быть или не быть установлен в ERANGE.

HUGE_VAL

Этот макрос используется, когда результат функции не может быть представлен в виде числа с плавающей запятой. Если величина правильного результата слишком велика для представления, функция устанавливает значение errno на ERANGE, чтобы указать ошибку диапазона, и возвращает конкретное, очень большое значение, названное макросом HUGE_VAL или его отрицанием (- HUGE_VAL).

Если величина результата слишком мала, вместо этого возвращается нулевое значение. В этом случае errno может быть или не быть установлен в ERANGE.

Функции библиотеки

Ниже приведены функции, определенные в заголовке math.h –

Sr.No. Описание функции
1 двойной акос (двойной х)

Возвращает арккосинус x в радианах.

2 двойной асин (двойной х)

Возвращает арксинус x в радианах.

3 двойной атан (двойной х)

Возвращает арктангенс х в радианах.

4 двойной atan2 (двойной у, двойной х)

Возвращает арктангенс в радианах y / x на основе знаков обоих значений, чтобы определить правильный квадрант.

5 двойной cos (double x)

Возвращает косинус радиального угла x.

6 двойной кош (двойной х)

Возвращает гиперболический косинус x.

7 двойной грех (двойной х)

Возвращает синус радиального угла x.

8 двойной грех (двойной х)

Возвращает гиперболический синус x.

9 двойной танх (двойной х)

Возвращает гиперболический тангенс x.

10 двойной опыт (двойной х)

Возвращает значение е, возведенное в x-ю степень.

11 double frexp (double x, int * exponent)

Возвращаемое значение – это мантисса, а целое число, на которое указывает показатель степени, – это показатель степени. Результирующее значение равно x = мантисса * 2 ^ экспонента.

12 double ldexp (double x, int exponent)

Возвращает x, умноженное на 2, возведенное в степень степени.

13 двойной журнал (двойной х)

Возвращает натуральный логарифм (логарифм base-e) x .

14 двойной log10 (двойной х)

Возвращает общий логарифм (логарифм с основанием 10) для x .

15 double modf (double x, double * integer)

Возвращаемое значение является компонентом дроби (часть после десятичной дроби) и устанавливает целочисленное значение для целочисленного компонента.

16 двойной пау (двойной х, двойной у)

Возвращает x, возведенное в степень y .

17 двойной квадрат (двойной х)

Возвращает квадратный корень из х .

18 двойной потолок (двойной х)

Возвращает наименьшее целочисленное значение, большее или равное x .

19 двойные fabs (двойной х)

Возвращает абсолютное значение х .

20 двойной пол (двойной х)

Возвращает наибольшее целочисленное значение, меньшее или равное x .

21 двойной fmod (двойной х, двойной у)

Возвращает остаток от x, деленный на y .

Возвращает арккосинус x в радианах.

Возвращает арксинус x в радианах.

Возвращает арктангенс х в радианах.

Возвращает арктангенс в радианах y / x на основе знаков обоих значений, чтобы определить правильный квадрант.

Возвращает косинус радиального угла x.

Возвращает гиперболический косинус x.

Возвращает синус радиального угла x.

Возвращает гиперболический синус x.

Возвращает гиперболический тангенс x.

Возвращает значение е, возведенное в x-ю степень.

Возвращаемое значение – это мантисса, а целое число, на которое указывает показатель степени, – это показатель степени. Результирующее значение равно x = мантисса * 2 ^ экспонента.

Возвращает x, умноженное на 2, возведенное в степень степени.

Возвращает натуральный логарифм (логарифм base-e) x .

Возвращает общий логарифм (логарифм с основанием 10) для x .

Возвращаемое значение является компонентом дроби (часть после десятичной дроби) и устанавливает целочисленное значение для целочисленного компонента.

Возвращает x, возведенное в степень y .

Возвращает квадратный корень из х .

Возвращает наименьшее целочисленное значение, большее или равное x .

Возвращает абсолютное значение х .

Возвращает наибольшее целочисленное значение, меньшее или равное x .

Возвращает остаток от x, деленный на y .

Библиотека C – <setjmp.h>

Заголовок setjmp.h определяет макрос setjmp () , одну функцию longjmp () и одну переменную типа jmp_buf для обхода обычного вызова функции и возврата.

Переменные библиотеки

Ниже приведен тип переменной, определенный в заголовке setjmp.h –

Sr.No. Переменная и описание
1

jmp_buf

Это тип массива, используемый для хранения информации для макроса setjmp () и функции longjmp () .

jmp_buf

Это тип массива, используемый для хранения информации для макроса setjmp () и функции longjmp () .

Макросы библиотеки

В этой библиотеке определен только один макрос –

Sr.No. Макрос и описание
1 int setjmp (среда jmp_buf)

Этот макрос сохраняет текущую среду в переменную среду для последующего использования функцией longjmp () . Если этот макрос возвращается непосредственно из вызова макроса, он возвращает ноль, но если он возвращается из вызова функции longjmp () , то возвращается ненулевое значение.

Этот макрос сохраняет текущую среду в переменную среду для последующего использования функцией longjmp () . Если этот макрос возвращается непосредственно из вызова макроса, он возвращает ноль, но если он возвращается из вызова функции longjmp () , то возвращается ненулевое значение.

Функции библиотеки

Ниже приводится единственная функция, определенная в заголовке setjmp.h:

Sr.No. Описание функции
1 void longjmp (окружение jmp_buf, значение int)

Эта функция восстанавливает среду, сохраненную последним вызовом макроса setjmp () при том же вызове программы с соответствующим аргументом jmp_buf .

Эта функция восстанавливает среду, сохраненную последним вызовом макроса setjmp () при том же вызове программы с соответствующим аргументом jmp_buf .

Библиотека C – <signal.h>

Заголовок signal.h определяет тип переменной sig_atomic_t , два вызова функций и несколько макросов для обработки различных сигналов, сообщаемых во время выполнения программы.

Переменные библиотеки

Ниже приведен тип переменной, определенный в заголовке signal.h –

Sr.No. Переменная и описание
1

sig_atomic_t

Это тип int и используется в качестве переменной в обработчике сигнала. Это интегральный тип объекта, к которому можно обращаться как к элементарному объекту, даже при наличии асинхронных сигналов.

sig_atomic_t

Это тип int и используется в качестве переменной в обработчике сигнала. Это интегральный тип объекта, к которому можно обращаться как к элементарному объекту, даже при наличии асинхронных сигналов.

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке signal.h, и эти макросы будут использоваться в двух функциях, перечисленных ниже. Макросы SIG_ используются с функцией сигнала для определения функций сигнала.

Sr.No. Макрос и описание
1

SIG_DFL

Обработчик сигналов по умолчанию.

2

SIG_ERR

Представляет ошибку сигнала.

3

SIG_IGN

Сигнал игнорировать.

SIG_DFL

Обработчик сигналов по умолчанию.

SIG_ERR

Представляет ошибку сигнала.

SIG_IGN

Сигнал игнорировать.

Макросы SIG используются для представления номера сигнала в следующих условиях:

Sr.No. Макрос и описание
1

SIGABRT

Аварийное завершение программы.

2

SIGFPE

Ошибка с плавающей точкой, например деление на ноль.

3

SIGILL

Незаконная операция.

4

SIGINT

Сигнал прерывания, такой как Ctrl-C.

5

SIGSEGV

Неверный доступ к хранилищу из-за нарушения сегмента.

6

SIGTERM

Запрос на прекращение.

SIGABRT

Аварийное завершение программы.

SIGFPE

Ошибка с плавающей точкой, например деление на ноль.

SIGILL

Незаконная операция.

SIGINT

Сигнал прерывания, такой как Ctrl-C.

SIGSEGV

Неверный доступ к хранилищу из-за нарушения сегмента.

SIGTERM

Запрос на прекращение.

Функции библиотеки

Ниже приведены функции, определенные в заголовке signal.h –

Sr.No. Описание функции
1 void (* сигнал (int sig, void (* func) (int))) (int)

Эта функция устанавливает функцию для обработки сигнала, т.е. обработчик сигнала.

2 Int рейз (Int Sig)

Эта функция вызывает генерирование сигнала sig . Аргумент sig совместим с макросами SIG.

Эта функция устанавливает функцию для обработки сигнала, т.е. обработчик сигнала.

Эта функция вызывает генерирование сигнала sig . Аргумент sig совместим с макросами SIG.

Библиотека C – <stdarg.h>

Заголовок stdarg.h определяет тип переменной va_list и три макроса, которые можно использовать для получения аргументов в функции, когда число аргументов неизвестно, т.е. переменное количество аргументов.

Функция переменных аргументов определяется с помощью многоточия (, …) в конце списка параметров.

Переменные библиотеки

Ниже приведен тип переменной, определенный в заголовке stdarg.h.

Sr.No. Переменная и описание
1

va_list

Этот тип подходит для хранения информации, необходимой для трех макросов va_start (), va_arg () и va_end () .

va_list

Этот тип подходит для хранения информации, необходимой для трех макросов va_start (), va_arg () и va_end () .

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке stdarg.h.

Sr.No. Макрос и описание
1 void va_start (va_list ap, last_arg)

Этот макрос инициализирует переменную ap для использования с макросами va_arg и va_end . Last_arg – это последний известный фиксированный аргумент, передаваемый в функцию, т.е. аргумент перед многоточием.

2 тип va_arg (va_list ap, тип)

Этот макрос извлекает следующий аргумент в списке параметров функции с типом type .

3 void va_end (va_list ap)

Этот макрос позволяет функции с переменными аргументами использовать макрос va_start для возврата. Если va_end не вызывается до возврата из функции, результат не определен.

Этот макрос инициализирует переменную ap для использования с макросами va_arg и va_end . Last_arg – это последний известный фиксированный аргумент, передаваемый в функцию, т.е. аргумент перед многоточием.

Этот макрос извлекает следующий аргумент в списке параметров функции с типом type .

Этот макрос позволяет функции с переменными аргументами использовать макрос va_start для возврата. Если va_end не вызывается до возврата из функции, результат не определен.

Библиотека C – <stddef.h>

Заголовок stddef.h определяет различные типы переменных и макросы. Многие из этих определений также появляются в других заголовках.

Переменные библиотеки

Ниже приведены типы переменных, определенные в заголовке stddef.h.

Sr.No. Переменная и описание
1

ptrdiff_t

Это целочисленный тип со знаком и результат вычитания двух указателей.

2

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

3

wchar_t

Это интегральный тип размера константы широкого символа.

ptrdiff_t

Это целочисленный тип со знаком и результат вычитания двух указателей.

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

wchar_t

Это интегральный тип размера константы широкого символа.

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке stddef.h.

Sr.No. Макрос и описание
1 НОЛЬ

Этот макрос является значением константы нулевого указателя.

2 offsetof (тип, член-указатель)

Это приводит к постоянному целому числу типа size_t, которое является смещением в байтах элемента структуры от начала структуры. Член задается указателем члена , а имя структуры указывается в типе .

Этот макрос является значением константы нулевого указателя.

Это приводит к постоянному целому числу типа size_t, которое является смещением в байтах элемента структуры от начала структуры. Член задается указателем члена , а имя структуры указывается в типе .

Библиотека C – <stdio.h>

Заголовок stdio.h определяет три типа переменных, несколько макросов и различные функции для выполнения ввода и вывода.

Переменные библиотеки

Ниже приведены типы переменных, определенные в заголовке stdio.h.

Sr.No. Переменная и описание
1

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

2

ФАЙЛ

Это тип объекта, подходящий для хранения информации для файлового потока.

3

fpos_t

Это тип объекта, подходящий для хранения любой позиции в файле.

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

ФАЙЛ

Это тип объекта, подходящий для хранения информации для файлового потока.

fpos_t

Это тип объекта, подходящий для хранения любой позиции в файле.

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке stdio.h.

Sr.No. Макрос и описание
1

НОЛЬ

Этот макрос является значением константы нулевого указателя.

2

_IOFBF, _IOLBF и _IONBF

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

3

BUFSIZ

Этот макрос является целым числом, которое представляет размер буфера, используемого функцией setbuf .

4

EOF

Этот макрос является отрицательным целым числом, которое указывает, что достигнут конец файла.

5

FOPEN_MAX

Этот макрос представляет собой целое число, представляющее максимальное количество файлов, которые система может гарантировать одновременное открытие.

6

FILENAME_MAX

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

7

L_tmpnam

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

8

SEEK_CUR, SEEK_END и SEEK_SET

Эти макросы используются в функции fseek для поиска различных позиций в файле.

9

TMP_MAX

Этот макрос – максимальное количество уникальных имен файлов, которые может сгенерировать функция tmpnam .

10

stderr, stdin и stdout

Эти макросы являются указателями на типы FILE, которые соответствуют стандартной ошибке, стандартному вводу и стандартным выходным потокам.

НОЛЬ

Этот макрос является значением константы нулевого указателя.

_IOFBF, _IOLBF и _IONBF

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

BUFSIZ

Этот макрос является целым числом, которое представляет размер буфера, используемого функцией setbuf .

EOF

Этот макрос является отрицательным целым числом, которое указывает, что достигнут конец файла.

FOPEN_MAX

Этот макрос представляет собой целое число, представляющее максимальное количество файлов, которые система может гарантировать одновременное открытие.

FILENAME_MAX

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

L_tmpnam

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

SEEK_CUR, SEEK_END и SEEK_SET

Эти макросы используются в функции fseek для поиска различных позиций в файле.

TMP_MAX

Этот макрос – максимальное количество уникальных имен файлов, которые может сгенерировать функция tmpnam .

stderr, stdin и stdout

Эти макросы являются указателями на типы FILE, которые соответствуют стандартной ошибке, стандартному вводу и стандартным выходным потокам.

Функции библиотеки

Ниже приведены функции, определенные в заголовке stdio.h.

Следуйте той же последовательности функций для лучшего понимания и использования опции Try it (Online compiler), потому что файл, созданный в первой функции, будет использоваться в последующих функциях.

Sr.No. Описание функции
1 int fclose (FILE * stream)

Закрывает поток. Все буферы сброшены.

2 void clearerr (FILE * stream)

Очищает конец файла и индикаторы ошибок для данного потока.

3 int feof (FILE * stream)

Проверяет индикатор конца файла для данного потока.

4 int ferror (FILE * stream)

Проверяет индикатор ошибки для данного потока.

5 int fflush (FILE * stream)

Очищает выходной буфер потока.

6 int fgetpos (FILE * stream, fpos_t * pos)

Получает текущую позицию файла потока и записывает его в поз.

7 FILE * fopen (const char * имя файла, режим const char *)

Открывает имя файла, на которое указывает имя файла, используя данный режим.

8 size_t fread (void * ptr, size_t size, size_t nmemb, FILE * stream)

Считывает данные из данного потока в массив, на который указывает ptr.

9 FILE * freopen (const char * имя файла, режим const char *, FILE * stream)

Связывает новое имя файла с заданным открытым потоком и одновременно закрывает старый файл в потоке.

10 int fseek (FILE * stream, long int offset, int fromce)

Устанавливает файловую позицию потока в заданное смещение. Смещение аргумента означает количество байтов, которые нужно найти из заданной позиции откуда .

11 int fsetpos (FILE * stream, const fpos_t * pos)

Устанавливает файловую позицию данного потока в данную позицию. Аргумент pos – это позиция, заданная функцией fgetpos.

12 long int ftell (FILE * stream)

Возвращает текущую позицию файла данного потока.

13 size_t fwrite (const void * ptr, size_t size, size_t nmemb, FILE * stream)

Записывает данные из массива, на который указывает ptr, в данный поток.

14 int удалить (const char * имя файла)

Удаляет указанное имя файла, чтобы оно больше не было доступно.

15 int rename (const char * old_filename, const char * new_filename)

Вызывает изменение имени файла, на которое ссылается old_filename, на new_filename.

16 перемотка void (FILE * stream)

Устанавливает позицию файла в начало файла данного потока.

17 void setbuf (FILE * stream, char * buffer)

Определяет, как поток должен быть буферизован.

18 int setvbuf (FILE * stream, char * buffer, int mode, size_t size)

Другая функция, чтобы определить, как поток должен быть буферизован.

19 FILE * tmpfile (void)

Создает временный файл в двоичном режиме обновления (wb +).

20 char * tmpnam (char * str)

Создает и возвращает действительное временное имя файла, которое не существует.

21 int fprintf (FILE * stream, const char * format, …)

Отправляет форматированный вывод в поток.

22 int printf (const char * format, …)

Отправляет отформатированный вывод на стандартный вывод.

23 int sprintf (char * str, const char * format, …)

Отправляет отформатированный вывод в строку.

24 int vfprintf (FILE * stream, const char * format, va_list arg)

Отправляет форматированный вывод в поток, используя список аргументов.

25 int vprintf (const char * format, va_list arg)

Отправляет отформатированный вывод на стандартный вывод, используя список аргументов.

26 int vsprintf (char * str, const char * format, va_list arg)

Отправляет форматированный вывод в строку, используя список аргументов.

27 int fscanf (FILE * stream, const char * format, …)

Читает форматированный ввод из потока.

28 int scanf (const char * format, …)

Читает форматированный ввод из стандартного ввода.

29 int sscanf (const char * str, const char * format, …)

Читает форматированный ввод из строки.

30 int fgetc (FILE * stream)

Получает следующий символ (символ без знака) из указанного потока и перемещает индикатор положения для потока.

31 char * fgets (char * str, int n, FILE * stream)

Читает строку из указанного потока и сохраняет ее в строке, на которую указывает str. Он останавливается, когда читается (n-1) символов, читается символ новой строки или достигается конец файла, в зависимости от того, что произойдет раньше.

32 int fputc (int char, FILE * stream)

Записывает символ (беззнаковый символ), указанный аргументом char, в указанный поток и перемещает индикатор положения для потока.

33 int fputs (const char * str, FILE * stream)

Записывает строку в указанный поток до, но не включая нулевой символ.

34 int getc (FILE * stream)

Получает следующий символ (символ без знака) из указанного потока и перемещает индикатор положения для потока.

35 int getchar (void)

Получает символ (без знака) из стандартного ввода.

36 char * gets (char * str)

Читает строку из stdin и сохраняет ее в строке, на которую указывает str. Он останавливается, когда читается символ новой строки или достигается конец файла, в зависимости от того, что произойдет раньше.

37 int putc (int char, FILE * stream)

Записывает символ (беззнаковый символ), указанный аргументом char, в указанный поток и перемещает индикатор положения для потока.

38 int putchar (int char)

Записывает символ (беззнаковый символ), указанный в аргументе char, в стандартный вывод.

39 int ставит (const char * str)

Записывает строку в стандартный вывод, но не включая нулевой символ. Символ новой строки добавляется к выводу.

40 int ungetc (int char, FILE * stream)

Вставляет символ char (без знака) в указанный поток, чтобы следующий символ был прочитан.

41 void perror (const char * str)

Печатает описательное сообщение об ошибке в stderr. Сначала печатается строка str, затем двоеточие, а затем пробел.

Закрывает поток. Все буферы сброшены.

Очищает конец файла и индикаторы ошибок для данного потока.

Проверяет индикатор конца файла для данного потока.

Проверяет индикатор ошибки для данного потока.

Очищает выходной буфер потока.

Получает текущую позицию файла потока и записывает его в поз.

Открывает имя файла, на которое указывает имя файла, используя данный режим.

Считывает данные из данного потока в массив, на который указывает ptr.

Связывает новое имя файла с заданным открытым потоком и одновременно закрывает старый файл в потоке.

Устанавливает файловую позицию потока в заданное смещение. Смещение аргумента означает количество байтов, которые нужно найти из заданной позиции откуда .

Устанавливает файловую позицию данного потока в данную позицию. Аргумент pos – это позиция, заданная функцией fgetpos.

Возвращает текущую позицию файла данного потока.

Записывает данные из массива, на который указывает ptr, в данный поток.

Удаляет указанное имя файла, чтобы оно больше не было доступно.

Вызывает изменение имени файла, на которое ссылается old_filename, на new_filename.

Устанавливает позицию файла в начало файла данного потока.

Определяет, как поток должен быть буферизован.

Другая функция, чтобы определить, как поток должен быть буферизован.

Создает временный файл в двоичном режиме обновления (wb +).

Создает и возвращает действительное временное имя файла, которое не существует.

Отправляет форматированный вывод в поток.

Отправляет отформатированный вывод на стандартный вывод.

Отправляет отформатированный вывод в строку.

Отправляет форматированный вывод в поток, используя список аргументов.

Отправляет отформатированный вывод на стандартный вывод, используя список аргументов.

Отправляет форматированный вывод в строку, используя список аргументов.

Читает форматированный ввод из потока.

Читает форматированный ввод из стандартного ввода.

Читает форматированный ввод из строки.

Получает следующий символ (символ без знака) из указанного потока и перемещает индикатор положения для потока.

Читает строку из указанного потока и сохраняет ее в строке, на которую указывает str. Он останавливается, когда читается (n-1) символов, читается символ новой строки или достигается конец файла, в зависимости от того, что произойдет раньше.

Записывает символ (беззнаковый символ), указанный аргументом char, в указанный поток и перемещает индикатор положения для потока.

Записывает строку в указанный поток до, но не включая нулевой символ.

Получает следующий символ (символ без знака) из указанного потока и перемещает индикатор положения для потока.

Получает символ (без знака) из стандартного ввода.

Читает строку из stdin и сохраняет ее в строке, на которую указывает str. Он останавливается, когда читается символ новой строки или достигается конец файла, в зависимости от того, что произойдет раньше.

Записывает символ (беззнаковый символ), указанный аргументом char, в указанный поток и перемещает индикатор положения для потока.

Записывает символ (беззнаковый символ), указанный в аргументе char, в стандартный вывод.

Записывает строку в стандартный вывод, но не включая нулевой символ. Символ новой строки добавляется к выводу.

Вставляет символ char (без знака) в указанный поток, чтобы следующий символ был прочитан.

Печатает описательное сообщение об ошибке в stderr. Сначала печатается строка str, затем двоеточие, а затем пробел.

Библиотека C – <stdlib.h>

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

Переменные библиотеки

Ниже приведены типы переменных, определенные в заголовке stdlib.h.

Sr.No. Переменная и описание
1

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

2

wchar_t

Это целочисленный тип размера константы широких символов.

3

div_t

Это структура, возвращаемая функцией div .

4

ldiv_t

Это структура, возвращаемая функцией ldiv .

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

wchar_t

Это целочисленный тип размера константы широких символов.

div_t

Это структура, возвращаемая функцией div .

ldiv_t

Это структура, возвращаемая функцией ldiv .

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке stdlib.h.

Sr.No. Макрос и описание
1

НОЛЬ

Этот макрос является значением константы нулевого указателя.

2

EXIT_FAILURE

Это значение для функции выхода, возвращаемой в случае сбоя.

3

EXIT_SUCCESS

Это значение для функции выхода, возвращаемой в случае успеха.

4

RAND_MAX

Этот макрос является максимальным значением, возвращаемым функцией rand.

5

MB_CUR_MAX

Этот макрос является максимальным числом байтов в многобайтовом наборе символов, которое не может быть больше, чем MB_LEN_MAX.

НОЛЬ

Этот макрос является значением константы нулевого указателя.

EXIT_FAILURE

Это значение для функции выхода, возвращаемой в случае сбоя.

EXIT_SUCCESS

Это значение для функции выхода, возвращаемой в случае успеха.

RAND_MAX

Этот макрос является максимальным значением, возвращаемым функцией rand.

MB_CUR_MAX

Этот макрос является максимальным числом байтов в многобайтовом наборе символов, которое не может быть больше, чем MB_LEN_MAX.

Функции библиотеки

Ниже приведены функции, определенные в заголовке stdio.h.

Sr.No. Описание функции
1 двойной atof (const char * str)

Преобразует строку, на которую указывает аргумент str, в число с плавающей запятой (тип double).

2 int atoi (const char * str)

Преобразует строку, на которую указывает аргумент str, в целое число (тип int).

3 long int atol (const char * str)

Преобразует строку, на которую указывает аргумент str, в длинное целое число (введите long int).

4 double strtod (const char * str, char ** endptr)

Преобразует строку, на которую указывает аргумент str, в число с плавающей запятой (тип double).

5 long int strtol (const char * str, char ** endptr, int base)

Преобразует строку, на которую указывает аргумент str, в длинное целое число (введите long int).

6 unsigned long int strtoul (const char * str, char ** endptr, int base)

Преобразует строку, на которую указывает аргумент str, в целое число без знака (введите unsigned long int).

7 void * calloc (size_t nitems, size_t size)

Выделяет запрошенную память и возвращает указатель на нее.

8 пусто (пусто * ptr

Выделение памяти, ранее выделенной вызовом calloc, malloc или realloc .

9 void * malloc (size_t size)

Выделяет запрошенную память и возвращает указатель на нее.

10 void * realloc (void * ptr, size_t size)

Попытки изменить размер блока памяти, на который указывает ptr, который ранее был выделен при вызове malloc или calloc .

11 void abort (void)

Вызывает ненормальное завершение программы.

12 int atexit (void (* func) (void))

Вызывает вызов указанной функции func при нормальном завершении программы.

13 Пустой выход (статус int)

Заставляет программу завершаться нормально.

14 char * getenv (const char * name)

Ищет строку среды, на которую указывает имя, и возвращает соответствующее значение в строку.

15 int system (const char * string)

Команда, указанная в строке, передается в хост-среду для выполнения командным процессором.

16 void * bsearch (const void * key, const void * base, size_t nitems, size_t size, int (* сравнение) (const void *, const void *))

Выполняет бинарный поиск.

17 void qsort (void * base, size_t nitems, size_t size, int (* сравнение) (const void *, const void *))

Сортирует массив.

18 int abs (int x)

Возвращает абсолютное значение х.

19 div_t div (int numer, int denom)

Делит число (числитель) на число (знаменатель).

20 long int labs (long int x)

Возвращает абсолютное значение х.

21 ldiv_t ldiv (длинный int numer, длинный int denom)

Делит число (числитель) на число (знаменатель).

22 int rand (void)

Возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX .

23 void srand (без знака int seed)

Эта функция запускает генератор случайных чисел, используемый функцией rand .

24 int mblen (const char * str, size_t n)

Возвращает длину многобайтового символа, на который указывает аргумент str .

25 size_t mbstowcs (schar_t * pwcs, const char * str, size_t n)

Преобразует строку многобайтовых символов, на которые указывает аргумент str, в массив, на который указывает pwcs .

26 int mbtowc (whcar_t * pwc, const char * str, size_t n)

Исследует многобайтовый символ, на который указывает аргумент str .

27 size_t wcstombs (char * str, const wchar_t * pwcs, size_t n)

Преобразует коды, хранящиеся в массиве pwcs, в многобайтовые символы и сохраняет их в строке str .

28 int wctomb (char * str, wchar_t wchar)

Исследует код, который соответствует многобайтовому символу, заданному аргументом wchar .

Преобразует строку, на которую указывает аргумент str, в число с плавающей запятой (тип double).

Преобразует строку, на которую указывает аргумент str, в целое число (тип int).

Преобразует строку, на которую указывает аргумент str, в длинное целое число (введите long int).

Преобразует строку, на которую указывает аргумент str, в число с плавающей запятой (тип double).

Преобразует строку, на которую указывает аргумент str, в длинное целое число (введите long int).

Преобразует строку, на которую указывает аргумент str, в целое число без знака (введите unsigned long int).

Выделяет запрошенную память и возвращает указатель на нее.

Выделение памяти, ранее выделенной вызовом calloc, malloc или realloc .

Выделяет запрошенную память и возвращает указатель на нее.

Попытки изменить размер блока памяти, на который указывает ptr, который ранее был выделен при вызове malloc или calloc .

Вызывает ненормальное завершение программы.

Вызывает вызов указанной функции func при нормальном завершении программы.

Заставляет программу завершаться нормально.

Ищет строку среды, на которую указывает имя, и возвращает соответствующее значение в строку.

Команда, указанная в строке, передается в хост-среду для выполнения командным процессором.

Выполняет бинарный поиск.

Сортирует массив.

Возвращает абсолютное значение х.

Делит число (числитель) на число (знаменатель).

Возвращает абсолютное значение х.

Делит число (числитель) на число (знаменатель).

Возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX .

Эта функция запускает генератор случайных чисел, используемый функцией rand .

Возвращает длину многобайтового символа, на который указывает аргумент str .

Преобразует строку многобайтовых символов, на которые указывает аргумент str, в массив, на который указывает pwcs .

Исследует многобайтовый символ, на который указывает аргумент str .

Преобразует коды, хранящиеся в массиве pwcs, в многобайтовые символы и сохраняет их в строке str .

Исследует код, который соответствует многобайтовому символу, заданному аргументом wchar .

Библиотека C – <string.h>

Заголовок string.h определяет один тип переменной, один макрос и различные функции для манипулирования массивами символов.

Переменные библиотеки

Ниже приведен тип переменной, определенный в заголовке string.h –

Sr.No. Переменная и описание
1

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

Макросы библиотеки

Ниже приведен макрос, определенный в заголовке string.h –

Sr.No. Макрос и описание
1

НОЛЬ

Этот макрос является значением константы нулевого указателя.

НОЛЬ

Этот макрос является значением константы нулевого указателя.

Функции библиотеки

Ниже приведены функции, определенные в заголовке string.h –

Sr.No. Описание функции
1 void * memchr (const void * str, int c, size_t n)

Ищет первое вхождение символа c (символ без знака) в первых n байтах строки, на которую указывает аргумент str .

2 int memcmp (const void * str1, const void * str2, size_t n)

Сравнивает первые n байтов str1 и str2 .

3 void * memcpy (void * dest, const void * src, size_t n)

Копирует n символов из src в dest .

4 void * memmove (void * dest, const void * src, size_t n)

Еще одна функция для копирования n символов из str2 в str1 .

5 void * memset (void * str, int c, size_t n)

Копирует символ c (символ без знака) в первые n символов строки, на которую указывает аргумент str .

6 char * strcat (char * dest, const char * src)

Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest .

7 char * strncat (char * dest, const char * src, size_t n)

Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest, длиной до n символов.

8 char * strchr (const char * str, int c)

Ищет первое вхождение символа c (символ без знака) в строке, на которую указывает аргумент str .

9 int strcmp (const char * str1, const char * str2)

Сравнивает строку, на которую указывает str1, со строкой, на которую указывает str2 .

10 int strncmp (const char * str1, const char * str2, size_t n)

Сравнивает не более первых n байтов str1 и str2 .

11 int strcoll (const char * str1, const char * str2)

Сравнивает строку str1 с str2 . Результат зависит от настройки местоположения LC_COLLATE.

12 char * strcpy (char * dest, const char * src)

Копирует указанную строку с помощью src в dest .

13 char * strncpy (char * dest, const char * src, size_t n)

Копирует до n символов из строки, на которую указывает src в dest .

14 size_t strcspn (const char * str1, const char * str2)

Вычисляет длину начального сегмента str1, который полностью состоит из символов, не входящих в str2.

15 char * strerror (int errnum)

Ищет во внутреннем массиве номер ошибки errnum и возвращает указатель на строку сообщения об ошибке.

16 size_t strlen (const char * str)

Вычисляет длину строки str до, но не включая завершающий нулевой символ.

17 char * strpbrk (const char * str1, const char * str2)

Находит первый символ в строке str1, который соответствует любому символу, указанному в str2 .

18 char * strrchr (const char * str, int c)

Ищет последнее вхождение символа c (символ без знака) в строке, на которую указывает аргумент str .

19 size_t strspn (const char * str1, const char * str2)

Вычисляет длину начального сегмента str1, который полностью состоит из символов в str2 .

20 char * strstr (const char * стог сена, const char * игла)

Находит первое вхождение всей строковой стрелки (не включая завершающий нулевой символ), которая появляется в стоге сена .

21 char * strtok (char * str, const char * delim)

Разбивает строку str на серию токенов, разделенных разделителем .

22 size_t strxfrm (char * dest, const char * src, size_t n)

Преобразует первые n символов строки src в текущую локаль и помещает их в строку dest .

Ищет первое вхождение символа c (символ без знака) в первых n байтах строки, на которую указывает аргумент str .

Сравнивает первые n байтов str1 и str2 .

Копирует n символов из src в dest .

Еще одна функция для копирования n символов из str2 в str1 .

Копирует символ c (символ без знака) в первые n символов строки, на которую указывает аргумент str .

Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest .

Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest, длиной до n символов.

Ищет первое вхождение символа c (символ без знака) в строке, на которую указывает аргумент str .

Сравнивает строку, на которую указывает str1, со строкой, на которую указывает str2 .

Сравнивает не более первых n байтов str1 и str2 .

Сравнивает строку str1 с str2 . Результат зависит от настройки местоположения LC_COLLATE.

Копирует указанную строку с помощью src в dest .

Копирует до n символов из строки, на которую указывает src в dest .

Вычисляет длину начального сегмента str1, который полностью состоит из символов, не входящих в str2.

Ищет во внутреннем массиве номер ошибки errnum и возвращает указатель на строку сообщения об ошибке.

Вычисляет длину строки str до, но не включая завершающий нулевой символ.

Находит первый символ в строке str1, который соответствует любому символу, указанному в str2 .

Ищет последнее вхождение символа c (символ без знака) в строке, на которую указывает аргумент str .

Вычисляет длину начального сегмента str1, который полностью состоит из символов в str2 .

Находит первое вхождение всей строковой стрелки (не включая завершающий нулевой символ), которая появляется в стоге сена .

Разбивает строку str на серию токенов, разделенных разделителем .

Преобразует первые n символов строки src в текущую локаль и помещает их в строку dest .

Библиотека C – <time.h>

Заголовок time.h определяет четыре типа переменных, два макроса и различные функции для манипулирования датой и временем.

Переменные библиотеки

Ниже приведены типы переменных, определенные в заголовке time.h –

Sr.No. Переменная и описание
1

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

2

clock_t

Этот тип подходит для хранения процессорного времени.

3

time_t is

Этот тип подходит для хранения календарного времени.

4

структура тм

Эта структура используется для хранения времени и даты.

size_t

Это целочисленный тип без знака и результат ключевого слова sizeof .

clock_t

Этот тип подходит для хранения процессорного времени.

time_t is

Этот тип подходит для хранения календарного времени.

структура тм

Эта структура используется для хранения времени и даты.

Структура ТМ имеет следующее определение –

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */
};

Макросы библиотеки

Ниже приведены макросы, определенные в заголовке time.h –

Sr.No. Макрос и описание
1

НОЛЬ

Этот макрос является значением константы нулевого указателя.

2

CLOCKS_PER_SEC

Этот макрос представляет количество тактовых частот процессора в секунду.

НОЛЬ

Этот макрос является значением константы нулевого указателя.

CLOCKS_PER_SEC

Этот макрос представляет количество тактовых частот процессора в секунду.

Функции библиотеки

Ниже приведены функции, определенные в заголовке time.h –

Возвращает указатель на строку, которая представляет день и время структуры timeptr.

Возвращает время процессора, использованное с начала эпохи, определенной реализацией (обычно начало программы).

Возвращает строку, представляющую локальное время на основе аргумента timer.

Возвращает разницу секунд между временем1 и временем2 (время1-время2).

Значение таймера разбивается на структуру tm и выражается в Всемирном координированном времени (UTC), также известном как среднее время по Гринвичу (GMT).

Значение таймера разбивается на структуру tm и выражается в местном часовом поясе.

Преобразует структуру, на которую указывает timeptr, в значение time_t в соответствии с местным часовым поясом.

Форматирует время, представленное в структуре timeptr, в соответствии с правилами форматирования, определенными в формате и сохраненными в str.

Вычисляет текущее время календаря и кодирует его в формате time_t.

complex::complex(const double& r, const double& im): _real(r), _imaginary(im){}

complex::complex(const complex& c): _real(c._real), _imaginary(c._imaginary){}

void complex::operator +=(const complex& c){

_imaginary += c._imaginary;

void complex::operator -=(const complex& c){

_imaginary -= c._imaginary;

void complex::operator *=(const complex& c){

tmp._real = _real*c._real _imaginary*c._imaginary;

tmp._imaginary = _real*c._imaginary + _imaginary*c._real;

void complex::operator /=(const complex& c){

tmp = (*this) * c.conjugate();

_real = tmp._real / c.module();

_imaginary = tmp._imaginary / c.module();

complex& complex::operator =(const complex& c){

_imaginary = c._imaginary;

complex& complex::operator =(const double& d){

const double& complex::real() const { return _real; }

const double& complex::imaginary() const { return _imaginary; }

void complex::swap(complex& c){

c._imaginary = _imaginary;

_imaginary = tmp._imaginary;

std::string complex::toString() const{

std::ostringstream strcout;

strcout << _real << » + i*( « << _imaginary << » )»;

double complex::module() const{

return _real*_real + _imaginary*_imaginary;

complex complex::conjugate() const{

return complex(_real, _imaginary);

// extern class interface

complex operator + (const complex& c1, const complex& c2){

complex operator (const complex& c1, const complex& c2){

complex operator * (const complex& c1, const complex& c2){

complex operator / (const complex& c1, const complex& c2){

std::ostream& operator << (std::ostream& os, const complex& c){

bool operator == (const complex& c1, const complex& c2){

return ((c1.real() == c2.real()) && (c1.imaginary() == c2.imaginary()));

complex pow(const complex&, const complex&){

double abs(const complex& c){

Понравилась статья? Поделить с друзьями:
  • Мелоксикам инструкция по применению уколы внутримышечно инструкция для чего цена
  • Штукатурка стен из пеноблоков внутри дома своими руками пошаговая инструкция
  • Материнская плата asus m2n sli инструкция
  • Medicia tambuel аппликатор грязевой инструкция по применению
  • Руководство по эксплуатации на французском языке