Во многих случаях, когда я смотрю код других людей, я вижу, что некоторые из них включают в себя файл .h, а некоторые — файл .c / .cpp. В чем разница?
Это зависит от того, что находится в файле (ах).
#include
Директива препроцессора просто вставляет указанный файл в этот момент в исходный файл.
Так что же актуально компилятор этап (который работает после препроцессор) видит результат всех этих вставок.
Заголовочные файлы обычно разрабатываются и предназначены для использования через #include
, Исходных файлов нет, но иногда это имеет смысл. Например, когда у вас есть C-файл, содержащий только определение и инициализатор:
const uint8_t image[] = { 128, 128, 0, 0, 0, 0, ... lots more ... };
Тогда имеет смысл сделать это доступным для некоторого фрагмента кода, используя #include
, Это файл C, так как на самом деле определяет (не просто объявляет) переменную. Возможно, он хранится в своем собственном файле, поскольку изображение преобразуется в источник C из какого-либо другого формата (изображения), используемого для редактирования.
.h файлы называются заголовочными файлами, они не должны содержать никакого кода (если только он не содержит информацию о шаблонном объекте C ++). Обычно они содержат прототипы функций, операторы typedefs, #define, которые используются исходными файлами, которые их содержат. Файлы .c являются исходными файлами. Как правило, они содержат реализацию исходного кода функций, которые были созданы в соответствующем заголовочном файле.
Источник- http://cboard.cprogramming.com/c-programming/60805-difference-between-h-c-files.html
Вы можете посмотреть на сайте GCC (https://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html) который сообщает хорошее резюме всех расширений, которые вы можете использовать в C / C ++:
Исходные файлы C ++ обычно используют один из суффиксов ‘.C’, ‘.cc’, ‘.cpp’, ‘.CPP’, ‘.c ++’, ‘.cp’ или ‘.cxx’; Заголовочные файлы C ++ часто используют «.hh», «.hpp», «.H» или (для общего кода шаблона) «.tcc»; и предварительно обработанные файлы C ++ используют суффикс «.ii». GCC распознает файлы с этими именами и компилирует их как программы на C ++, даже если вы вызываете компилятор так же, как и для компиляции программ на C (обычно с именем gcc).
Включение заголовочного файла с объявлениями является основным, рекомендуемым и используемым практически везде, методом создания согласованных объявлений в проекте. Включение другого исходного файла — это другой (очень редкий) тип зверя, и он полезен и возможен при определенных условиях:
static
но какая версия включена, регулируется параметрами компиляции. Другой вариант — проблемы с размером и / или обслуживанием.Здесь я использовал термины определение а также декларация таким образом, что следующие являются декларациями:
extern int qq;
void f(int);
#define MYDATATYPE double
и следующие определения:
int qq; // here, the variable is allocated and exported
void f(int x) { printf("%d\n", x); } // the same for function
(Кроме того, объявления включают методы C ++ с телами, объявленными внутри определения их класса.)
Во всяком случае, дело другое .c / .cxx / etc. Файл, включенный в исходный файл, очень запутан и его следует избегать до самой реальной необходимости. Иногда для таких файлов используется определенный суффикс (например, .tpl), чтобы избежать путаницы читателя.