C: Заголовочные файлы

В рамках серьезных проектов на языке 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:

  1. #include <stdio.h>
  2.  
  3. void print_hello(void)
  4. {
  5.         printf("Hello worldn");
  6. }

Загрузить исходный код примера

Это — содержимое файла исходного кода hello.h:

  1. #ifndef HELLO_H
  2. #define HELLO_H
  3.  
  4. void print_hello(void);
  5.  
  6. #endif /*HELLO_H*/

Загрузить исходный код примера

А это — содержимое файла исходного кода hellomain.c:

  1. #include <stdio.h>
  2. #include "hello.h"
  3.  
  4. int main()
  5. {
  6.         print_hello();
  7.        
  8.         return 0;
  9. }

Загрузить исходный код примера

Как видите, все предельно просто. Единственным нюансом является компиляция проектов с заголовочными файлами. Каждый файл исходного кода такого проекта компилируется по отдельности, после чего производится связывание результирующих файлов объектного кода. В случае рассматриваемой программы компиляция будет осуществляться с помощью данной последовательности команд:

$ gcc -c hello.c -o hello.o
$ gcc -c hellomain.c -o hellomain.o
$ gcc hello.o hellomain.o -o hello

Данный подход к компиляции имеет одно весомое преимущество: при модификации отдельных файлов исходного кода будет осуществляться повторная компиляция лишь этих файлов, а не всего проекта (конечно же, вместе с повторным связыванием).