В чем разница между файлом .cpp и файлом .h? - PullRequest
52 голосов
/ 18 мая 2009

Поскольку я создал файлы .cpp, а затем перевел их в файлы .h, единственное отличие, которое я могу найти, это то, что вы не можете #include .cpp файлы. Есть ли какая-то разница, что мне не хватает?

Ответы [ 8 ]

50 голосов
/ 18 мая 2009

Система сборки C ++ (компилятор) не знает различий, поэтому все это одно из соглашений.

Соглашение состоит в том, что файлы .h являются объявлениями, а файлы .cpp - определениями.

Вот почему .h файлы включены в каталог - мы включаем объявления.

22 голосов
/ 18 мая 2009

Файл .cpp является модулем компиляции: это реальный файл исходного кода, который будет скомпилирован (в C ++).

.h (заголовочные) файлы - это файлы, которые будут фактически скопированы / вставлены в файлы .cpp, где появляется инструкция прекомпилятора #include. Как только код заголовка вставлен в код .cpp, может начаться компиляция .cpp.

12 голосов
/ 18 мая 2009

Я знаю разницу между декларацией и определением.

Принимая во внимание:

  • Файл CPP включает определения из любого заголовка, который он включает (поскольку CPP и файл заголовка вместе становятся единым «модулем перевода»)
  • Файл заголовка может быть включен более чем одним файлом CPP
  • Компоновщику обычно не нравится что-либо определенное в более чем одном файле CPP

Поэтому любые определения в заголовочном файле должны быть встроенными или статическими. Заголовочные файлы также содержат объявления, которые используются более чем одним файлом CPP.

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

7 голосов
/ 18 мая 2009
Файлы

.h или заголовочные файлы используются для перечисления общедоступных переменных экземпляра и и методов в объявлении класса. Файлы .cpp или файлы реализации используются для фактической реализации этих методов и использования этих переменных экземпляра.

Причина, по которой они являются отдельными, заключается в том, что файлы .h не компилируются в двоичный код, а файлы .cpp. Возьмите библиотеку, например. Скажем, вы автор, и вы не хотите, чтобы это было с открытым исходным кодом. Таким образом, вы распространяете скомпилированную двоичную библиотеку и файлы заголовков для ваших клиентов. Это позволяет им легко видеть всю информацию о классах вашей библиотеки, которые они могут использовать, не видя, как вы реализовали эти методы. Они больше для людей, использующих ваш код, а не для компилятора. Как было сказано ранее: это конвенция.

6 голосов
/ 18 мая 2009

Файл заголовка (.h, .hpp, ...) содержит

  • Определения классов (class X { ... };)
  • Определения встроенных функций (inline int get_cpus() { ... })
  • Объявления функций (void help();)
  • Объявления объектов (extern int debug_enabled;)

Исходный файл (.c, .cpp, .cxx) содержит

  • Определения функций (void help() { ... } или void X::f() { ... })
  • Определения объектов (int debug_enabled = 1;)

Однако соглашение о том, что заголовки именуются суффиксом .h, а исходные файлы именуются суффиксом .cpp, на самом деле не требуется. Хороший компилятор всегда может сказать, как обрабатывать какой-либо файл, независимо от суффикса имени файла (-x <file-type> для gcc. Как -x c++).

Исходные файлы будут содержать определения, которые должны присутствовать только один раз во всей программе. Поэтому, если вы куда-нибудь включите исходный файл, а затем скомпонуете результат компиляции этого файла, а затем один из самого исходного файла, тогда, конечно, вы получите ошибки компоновщика, потому что у вас эти определения теперь появляются дважды: Один раз в включен исходный файл, а затем в файл, который его включил. Вот почему у вас были проблемы с включением файла .cpp.

1 голос
/ 18 мая 2009

Хорошее практическое правило: «.h файлы должны иметь объявления [потенциально] используемые несколькими исходными файлами, но без кода, который запускается.»

1 голос
/ 18 мая 2009

Другие уже предложили хорошие объяснения, но я подумал, что должен уточнить различия между различными расширениями:

  Source Files for C: .c
  Header Files for C: .h

  Source Files for C++: .cpp
  Header Files for C++: .hpp

Конечно, как уже указывалось, это всего лишь условности. На самом деле компилятор не обращает на них никакого внимания - это чисто для блага кодера.

0 голосов
/ 18 мая 2009

По договоренности, файлы .h включаются другими файлами и никогда не компилируются напрямую. Файлы .cpp - опять же, по соглашению - корни процесса компиляции; они включают в себя файлы .h прямо или косвенно, но обычно это не файлы .cpp.

...