> Обьясни у каждого .h файла есть .c
> Или бывает так что .h есть, а .c нет?
> то что .c может быть без .h понятно Компилируется именно .c файл (в объектный файл), .h файл не компилируется. Перед этапом компиляции запускается препроцессор и просто заменяет все строки "#include" содержимым указанного .h файла.
Так что да, может быть .h без соответствующего .c файла. Например, у тебя есть разные модули (.c файлы): модуль для датчика температуры, модуль для общения с дисплеем, модуль для общения с микросхемой RTC и т.д. Во всех модулях тебе нужно получать нижний и верхний байт от двухбайтной переменной. Можно сделать хедер, назвать его например "common.h":
#ifndef COMMON_H
#define COMMON_H#include <stdint.h>
/* Routines to get the high and low byte of 16-bit word */
#define HI(x) ((uint8_t)(x >> 8))
#define LO(x) ((uint8_t)(x))
#endif /* COMMON_H */
Дальше в каждом модуле подключить этот хедер и использовать макросы из него. При это не будет никакого "common.c" файла и всё будет работать.
На самом деле в .h файлы обычно засовывают две вещи:
1. объявления функций какого-то .c файла, т.е. интерфейс этого .c файла (чтобы другие .c файлы могли юзать эти функции подключая этот хедер)
2. всякие макросы, которые могут использованы разными модулями (.c файлами)
В свою очередь без .h файла тоже можно обойтись -- просто скопировать руками содержимое .h файла вместо соответствующей строки #include.