Я недавно прочитал CSAPP, и у меня были некоторые сомнения по поводу его части системы компиляции.
Теперь у нас есть пример, использующий HelloWorld.c (просто напечатайте hello world). В книге говорится, что на этапе предварительной обработки они заменяют строку «#include» содержимым этого заголовочного файла. Но когда я открываю stdio.h, я обнаруживаю, что существует только объявление для printf (), и нет конкретной реализации. Итак, когда в системе компиляции будет введена конкретная реализация printf ()?
И в книге также сказано, что на этапе компоновки компоновщик (ld) связал helloworld.o и printf.o. Почему компоновщик знает, как связать мой объектный файл с printf.o? Почему в системе компиляции она объявляет эту функцию на первом этапе (фаза препроцессора) и связывает конкретную реализацию на последнем этапе (фаза компоновки)?