14.0 (Russian conspect)
Поговорим о сборке проектов на языке си если они состоят из нескольких файлов.
Последовательность сборки проекта:
Препроцессинг, транслятор, перевод в код ассемблера и линкер.
Чтобы получить бинарник на выходе мы можем просто скомпилировать оба файла, но это не очень хорошо так как если у нас 100500 этих файлов, то компиляция проходит не так быстро как для двух файлов.
Лучше довести это состояние до объектника.
Если мы поменяли один файл, то при попытке скомпилировать мы будем использовать старые версии объектников.
Поэтому, когда мы изменяем один файл нам не нужно перекомпилировать все файлы, нам достаточно перекомпилировать только тот который мы обновили.
Поговорим про makefile: он состоит из трех частей – вы описываете цель, которую вы хотели получить, исходники из которой эту цель можно получить и рецепт с помощью которого эта цель получается из этих исходников.
Если в цепочке зависимости появляется новый файл, то все что идет после него в цепочке нужно перегенерировать.
Обратите внимание на то, что определение последовательности сборки произошло автоматически то есть мы сначала построили дерево потом определили независимые ветки этого дерева и потом прошли это дерево в произвольном порядке собрав сначала объектники а потом из них бинарники.
Таргеты совсем не обязательно являются таргетами по сборке, таргет это всего лишь некое правило, сопровождаемое рецептом как это правило реализовать.
По историческим причинам в makefile рецепты всегда начинаются на табуляцию.
В си не существует такого типа данных как строка. Вместо строк в си есть библиотека, которая работает с цепочками байтов заканчивающиеся 0.
Там есть ряд таких полезных функций например таких как
isalnum, isalpha, islower, isupper, isdigit
и так далее.
Эти функции символьные. Также есть функции преобразования, например tolower, toupper.
Обратите внимание что они тоже символьные, то есть они не со строкой работают.
Также есть атомарные функции, которые превращают одно число в строку или одну строку в число.