Подтвердить что ты не робот

В чем разница между .cpp файлом и файлом .h?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Я знаю разницу между объявлением и определением.

В то время как:

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

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

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

Ответ 4

Файл заголовка (.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. Like -x c++).

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

Хорошим правилом является ".h файлы должны иметь декларации [потенциально], используемые несколькими исходными файлами, но никакого кода, который запускается".

Ответ 8

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