03.0 (Russian conspect)
Случается ситуация, когда компиляция нашей программы требует нескольких файлов. Идея в том, что у нас есть набор кода, например какая-нибудь функция. Когда запускается программа, написанная на С, то ей передаются 3 открытых файла: два на запись и один на чтение stderr, stdin и stdout.
&i – указатель на переменную i, а в действительности это её адрес.
В С переменные – точно тоже самое, что и метки в ассемблере.
Программа на С выглядит гораздо больше скомпилированная, потому что помимо текста наше программы к ней еще присоединяется использующая система, то есть то, что обслуживает скомпилированную программу на С и делает всякие штуки с ней, в частности то, что вызывает функцию main, а вызывает оно обычным способом.
Мы обязательно встретимся с ситуацией зачем придумали разделение стандартного вывода ошибок.
Поток управления и поток данных нужно разделять.
Представим, что программа вводит данные: она стандартно вводит данные и на стандартный вывод вводит данные. Допустим рассчитывает пенсию: Вводит ФИО, возраст, пол и выводит полагающуюся пенсию и внезапно выясняется, что нет в базе данных соответствующего пользователя и программа должна вывести сообщение, что пользователя нет. И получается, что среди данных: пользователя нет, 0. То есть то место куда выводят ошибки и то место куда выводятся данные – должны различаться. Если у нас обычные текстовые потоки, просто открытые файла, то вот решение: стандартный вывод ошибок и стандартный вывод данных.
Продолжим о многофайловой сборке:
Представим, что нашу функцию debug мы хотим использовать в нескольких проектах:
· Открыть новый файл debug.c
· Переломить туда нашу функцию
В debug.c заинклюдить debug.c
При этом произойдет: компилятор из двух файлов, а на самом деле из трех состряпает из всех файлов один точнее не компилятор, а препроцессор.
С’шная компиляция состоит не из двух стадий, а из трех.
1. Препроцессор
2. Компилятор
3. Компоновщик
Библиотеки – это набор объектных файлов заранее скомпилированных и собранных в один архив.
Эта команда делает следующее: берет файл o.c., debug.c компилирует их до объектного кода, просматривает какие имена там не определены. Опять же эта команда формирует два таких файла смотрит неожиданные функции, если мы не указали любую другую библиотеку, она лезет в стандартную библиотеку С, смотрит в каком из этих объектных модулей, которые заархивированы туда лежат эти нужные нам функции, разархивирует их и все эти объектные модули компилирует вместе с нашими o.c и debug.o в один большой бинарник, который называется exe4 потому что он получается 6 мб.