Определения препроцессора являются локальными для текущей единицы компиляции.
Конечно, есть сложные случаи, но вот в чем суть:
Попробуйте взглянуть на .cpp(исходные) файлы как отдельные объекты.Если вы не делаете действительно странных вещей, то, если вы удалите все файлы .cpp, за исключением того, который вас беспокоит, вы можете все равно скомпилировать, потому что на этапе компиляции нет необходимости в определениях, вам нужно только имя ( объявление *)1008 *) вещей.
Итак, компиляция N исходных файлов за один прогон, по сути, такова:
[ *.H + SOURCE1.CPP ] --> SOURCE1.O
[ *.H + SOURCE2.CPP ] --> SOURCE2.O
...
[ *.H + SOURCEN.CPP ] --> SOURCEN.O
, где каждая строка представляет собой отдельный блок компиляции , которыйотображает SourceX.CPP и включенные заголовки в объектный файл.Таким образом, мы получили здесь отдельную вещь N.
Таким образом, если вы не измените общие заголовки, вам не придется перекомпилировать неизмененные исходные файлы.Конечно, если вы измените исходный файл, вам придется его перекомпилировать.И, наконец, если вы измените общий заголовок, вам придется перекомпилировать каждый исходный файл, в который он был включен.Здесь я должен упомянуть, что перед фазой компиляции вся строка #inlude "filename.ext"
(директива препроцессора ) будет заменена точным содержимым файла filename.ext, каким бы он ни был.
Тогда связывание - это другая проблема, на этом этапе цель состоит в том, чтобы создать один единственный файл из этих N объектных файлов. (повторяю, это простой случай)
Это ссылка:
[ SOURCE1.O + SOURCE2.O + ... + SOURCEN.O ] --> EXECUTABLE.FILE
Представьте, что затронутые объектные файлы представляют собой пакет значений и алгоритмов ( определения функций ).Например, где-то в пакете должна быть ровно одна функция main
( определение ), поэтому компоновщик точно будет знать, что делать при запуске программы.
Надеюсь, вы получилиэто
Угадайте, что произойдет, если вы запишите определение глобальной функции в файл заголовка, а затем включите его в два отдельных блока компиляции, а затем попытаетесь связать их.
Ответ:ошибка компоновщика - несколько определений, так как вы можете скомпилировать их отдельно.