В чем разница header файлов и исходников в C
Что проверяют
Понимаете ли вы, как программа на C собирается из частей: что делает препроцессор, что компилятор, а что линкер. Для тестировщика это прямая польза: по тексту ошибки сборки понятно, где искать проблему и в чьей она зоне. Следом часто спрашивают, что будет, если определить переменную прямо в заголовке.
Как отвечать
Начните с разделения ролей:
- заголовочный файл
.h: интерфейс модуля. Прототипы функций,structиtypedef, макросы,extern-объявления глобальных переменных. Кода, который порождает инструкции или выделяет память, там быть не должно, исключение составляютstatic inlineфункции; - исходный файл
.c: реализация, то есть определения функций и переменных. Каждый.cвместе с подключёнными заголовками образует единицу трансляции и компилируется в объектный файл.oотдельно от остальных; #include: текстовая вставка содержимого файла препроцессором. Заголовок сам по себе не компилируется;- защита от повторного включения: связка
#ifndef/#define/#endifили нестандартный, но повсеместно поддерживаемый#pragma once; - линковка: линкер собирает объектные файлы и сопоставляет вызовы с определениями.
Отсюда два класса ошибок. Нет объявления: компилятор ругается на неявное объявление функции, в свежих GCC это уже ошибка по умолчанию. Нет определения или их два: ошибка приходит от линкера, undefined reference или multiple definition.
Свяжите это с тестированием. Юнит-тест на модуль (Unity, CMocka, Check) подключает его заголовок и линкуется с его объектным файлом, а заглушка получается подменой .c с тем же интерфейсом на этапе сборки.
Где спотыкаются
Говорят, что заголовок «тоже компилируется в объектный файл». Нет, он существует только внутри .c, который его подключил.
Путают объявление и определение. int counter; в заголовке, подключённом в два файла, даёт multiple definition: правильно писать extern int counter; в .h и одно определение в .c.
Не отличают ошибку компиляции от ошибки линковки и советуют «добавить include», когда на самом деле в сборку не попал нужный .c или библиотека.