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