Надлежащая практика:
- Каждый исходный файл или файл заголовка должен включать заголовочные файлы, которые объявляют любой идентификатор, который он использует.
- Каждый исходный файл должен включать «свой» заголовокfile, то есть заголовочный файл, который объявляет каждый внешний идентификатор, который определяет исходный файл.
Причина первого - сообщить компилятору об используемых идентификаторах. Это дает компилятору информацию, необходимую для правильной компиляции программы.
Причина последнего заключается в том, чтобы убедиться, что объявления соответствуют определениям. Включив заголовочный файл в исходный файл, компилятор видит и объявление, и определение во время одной и той же компиляции, поэтому он может выдать сообщение об ошибке, если объявление несовместимо с определением.
Это возможно объявить функцию, явно поместив ее объявление в исходный файл, где она используется вместо заголовка, но это плохая практика, потому что ошибки могут возникать из-за ошибок при вводе или изменений, которые сделаны в одном файле, ине другое.
Нет необходимости включать файлы заголовков, которые объявляют идентификаторы, не используемые исходным файлом, даже если эти идентификаторы используются другими файлами. В вашем примере с function.c
, function.c
не нужно включать <stdio.h>
, если он не использует какой-либо идентификатор из <stdio.h>
. Тот факт, что main.c
использует <stdio.h>
, не имеет значения, потому что когда компилятор компилирует function.c
, он отделен от main.c
.