Файл заголовка (.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
.