В чем разница между включением файла .c и файла .h

Много раз, когда я смотрю код других людей, я вижу, что некоторые из них включают файл .h, а некоторые включают файл .c / .cpp. В чем разница?


person odbhut.shei.chhele    schedule 25.08.2014    source источник
comment
Технически ничего, вы можете включить любое имя файла, которое вам нравится, и файл просто открывается и копируется на место. Обычно файлы .h содержат объявления функций и т. Д., А файлы .cpp содержат определения (которые вам не нужно видеть для вызова функции). Это довольно странно для #include .cpp файла.   -  person BoBTFish    schedule 25.08.2014
comment
Основное отличие состоит в том, что включение _1 _ / _ 2_ файлов почти всегда приводит к серьезным проблемам.   -  person πάντα ῥεῖ    schedule 25.08.2014
comment
Что за беда?   -  person odbhut.shei.chhele    schedule 25.08.2014
comment
@ eddard.stark Множественные ошибки определения на этапе компоновки в большинстве случаев   -  person πάντα ῥεῖ    schedule 25.08.2014
comment
Если это не так уж и сложно, то не могли бы вы объяснить мне это или дать ссылку, пожалуйста, спасибо :)   -  person odbhut.shei.chhele    schedule 25.08.2014
comment
@ eddard.stark См. здесь, пожалуйста (и вопрос соответственно).   -  person πάντα ῥεῖ    schedule 25.08.2014


Ответы (4)


Это зависит от того, что находится в файле (ах).

Директива препроцессора #include просто вставляет указанный файл в этот момент в исходный файл.

Итак, то, что видит фактический этап компилятора (который запускается после препроцессора), является результатом всей этой вставки.

Заголовочные файлы обычно разрабатываются и предназначены для использования через #include. Исходных файлов нет, но иногда это имеет смысл. Например, если у вас есть файл C, содержащий только определение и инициализатор:

const uint8_t image[] = { 128, 128, 0, 0, 0, 0, ... lots more ... };

Тогда имеет смысл сделать это доступным для некоторого фрагмента кода с помощью #include. Это файл C, поскольку он на самом деле определяет (а не просто объявляет) переменную. Возможно, он хранится в собственном файле, поскольку изображение конвертируется в исходный код C из какого-либо другого (изображения) формата, используемого для редактирования.

person unwind    schedule 25.08.2014
comment
Итак, что я должен поместить в файл .h, а что - в файл .c? - person odbhut.shei.chhele; 25.08.2014
comment
Должен ли я помещать прототипы функций в файл .h, а функцию - в файл .c? - person odbhut.shei.chhele; 25.08.2014
comment
@ eddard.stark Да, это очень часто. Заголовки используются для описания общедоступного интерфейса модуля кода, реализованного файлом C. Не включайте никаких static прототипов функций, они не являются общедоступными. - person unwind; 25.08.2014

Файлы .h называются заголовочными файлами, они не должны содержать никакого кода (если только он не содержит информацию о шаблонном объекте C ++). Обычно они содержат прототипы функций, typedefs, операторы #define, которые используются исходными файлами, которые их включают. Файлы .c являются исходными файлами. Обычно они содержат реализацию исходного кода функций, которые были прототипированы в соответствующем файле заголовка.

Источник: http://cboard.cprogramming.com/c-programming/60805-difference-between-hc-files.html

person MSHasan    schedule 25.08.2014

вы можете посетить веб-сайт 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).

person prisco.napoli    schedule 25.08.2014

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

  1. Есть причина разделить код на отдельные исходные файлы, несмотря на то, что он должен быть скомпилирован как единый модуль. Например, есть разные версии некоторых функций, которые не видны из других модулей. Итак, они объявлены static, но какая версия включена, регулируется параметрами компиляции. Другой вариант - это проблемы с размером и / или учетными данными для обслуживания.
  2. Включенный файл не компилируется сам по себе как модуль проекта. Таким образом, его экспортированные определения не конфликтуют с модулем, в который включен файл.

Здесь я использовал термины определение и объявление так, как следующие являются объявлениями:

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), чтобы не запутать читателя.

person Netch    schedule 25.08.2014