Почему код успешно компилируется?
Потому что ваш компилятор автоматически связывает стандартную C библиотеку. Стандартная библиотека C содержит определение функции printf
.
Разве не возникает ошибка компиляции, например, функция printf не определена?
Нет , компилятор должен предоставить определения для стандартных символов, и printf
является одним из них (в размещенной среде).
Мой вопрос: где мне определить функцию foo?
Где угодно хотите. В main.c
или в другом .c
файле по вашему желанию. Обычно это хорошая практика, я ожидаю, что foo
будет определено в foo.c
, потому что его объявление находится в foo.h
.
Есть ли другое место, кроме main. c ?
Да, в другой единице перевода - в другом .c
файле. Например, в foo.c
.
Если нет, то какой смысл использовать файлы заголовков?
Долгое время компьютеры go не были такими быстрые, как сегодня - но все же в этих компьютерах был C язык. Потому что компиляторы Histori c не могли проанализировать все определения функций в одном большом файле, потому что, например, из-за ограниченной памяти, доступной в то время, для скорости компиляции определение символа было разделено на более мелкие блоки. Объявление символов помещалось в один файл, определения - в другой. Таким образом, компиляторы компилируют небольшие .c
файлы, которые видят только короткие .h
файлы, содержащие только меньшее количество информации, а затем, после компиляции на отдельном этапе, компоновщик связывает все предварительно скомпилированные .c
файлы вместе. Таким образом, компиляция использует меньше ресурсов за раз.
В настоящее время новым языкам программирования просто все равно - когда вы пишете на этих языках, например, import
, компилятор работает так, как будто он извлекает объявления из определений. Компьютеры достаточно быстрые и мощные, чтобы справиться с этим с легкостью. С новейшим добавлением module
s в C ++ сообщество C ++ надеется получить аналогичные механизмы.
Почему бы не определить (и таким образом объявить) функцию foo непосредственно в main. c?
Разделение определений символов между исходными файлами - это вопрос качества. Мы, программисты, разделяем информацию на более мелкие части и помещаем их в отдельные файлы, чтобы упростить управление большими программами. Но, конечно, почему бы и нет - если это небольшая программа, просто сделайте это в одном файле, есть много программ, написанных в одном файле .c
(это очень длинный, например, более 3000 строк).