Заголовочные файлы / библиотека / STL

277
04 декабря 2017, 17:33

Я правильно понимаю, что: Библиотека - это набор функций ? Заголовочный файл - это набор прототипов нужных функций из библиотеки ? Стандартная библиотека - это набор стандартных функций ?

То есть если я пишу #include "ctime", то по сути я из STL вытягиваю нужные для меня функции ?

Answer 1

Фактически заголовочный файл может содержать объявления (описания) и/или определения (реализации) различных сущностей (функций, классов, переменных и подобных). Если в заголовочном файле есть и объявление, и определение всех сущностей, то его можно считать header-only библиотекой, т.е. достаточно подключить заголовочный файл для того, что бы подключить библиотеку.

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

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

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

Answer 2

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

#include <ctime>

Этим задается правильный порядок поиска файлов. Более подробно об этом аспекте в отдельном вопросе: В чем различие между двумя формами директивы #include: в кавычках и в скобках?

READ ALSO
оператор new возвращает указатель на 0 байт

оператор new возвращает указатель на 0 байт

Для чего может понадобиться такая конструкция и почему при запросе 0 байт возвращается указатель

222
Не срабатывает realloc с разыменованием указателя

Не срабатывает realloc с разыменованием указателя

Есть два класса - родитель (Capture) и потомок (Camera)В родителе реализована одна общая функция, которая вызывает функцию, переопределённую у потомков:

228
Определить какая кнопка зажата (стиль)

Определить какая кнопка зажата (стиль)

Есть, например, 200 кнопок (обычная и radiobutton)

250