В рамках серьезных проектов на языке C может использоваться множество заголовочных файлов, имеющих расширение .h. В этих файлах обычно размещаются прототипы функций и макросы, которые используются более чем в одном файле исходного кода.
Заголовочные файлы подключаются к файлам исходного кода приложения по мере необходимости с помощью директивы #include.
#include "sums.h"
Данная директива отличается от ранее рассмотренных директив для подключения системных заголовочных файлов тем, что вместо скобок используются кавычки.
Также следует помнить о том, что содержимое каждого заголовочного файла должно быть защищено от рекурсивного подключения. Для этой цели используются три директивы препроцессора.
#ifndef SUMS_H
#define SUMS_H
…
#endif /*SUMS_H*/
В некоторых файлах подключение заголовочного файла должно осуществляться на основе какого-либо критерия. Например, первый заголовочный файл может использоваться для одной архитектуры центрального процессора, а второй — для другой. Эта задача также решается с помощью препроцессора.
#if x86_64
#include "system64.h"
#elif x86
#include "system32.h"
#endif
В данном простом примере функция вывода приветствия находится в отдельном файле исходного кода (hello.c), который подключается к основному файлу исходного кода программы (hellomain.c) с помощью заголовочного файла (hello.h).
Это содержимое файла исходного кода hello.c:
Загрузить исходный код примера
Это — содержимое файла исходного кода hello.h:
Загрузить исходный код примера
А это — содержимое файла исходного кода hellomain.c:
Загрузить исходный код примера
Как видите, все предельно просто. Единственным нюансом является компиляция проектов с заголовочными файлами. Каждый файл исходного кода такого проекта компилируется по отдельности, после чего производится связывание результирующих файлов объектного кода. В случае рассматриваемой программы компиляция будет осуществляться с помощью данной последовательности команд:
$ gcc -c hello.c -o hello.o
$ gcc -c hellomain.c -o hellomain.o
$ gcc hello.o hellomain.o -o hello
Данный подход к компиляции имеет одно весомое преимущество: при модификации отдельных файлов исходного кода будет осуществляться повторная компиляция лишь этих файлов, а не всего проекта (конечно же, вместе с повторным связыванием).