Простой ответ заключается в том, что вы почти всегда хотите включать файлы .h и компилировать файлы .cpp. Файлы CPP (обычно) являются истинным кодом, а файлы H (обычно) являются предварительными декларациями.
Более длинный ответ заключается в том, что вы можете включить любой из них, и это может сработать для вас, но оба приведут к немного отличающимся результатам.
То, что делает «include», это в основном копирование / вставка файла в этой строке. Не имеет значения, какое это расширение, оно будет таким же образом включать содержимое файла.
Но код C ++ обычно пишется так:
SomeClass.cpp -
#include "SomeClass.h"
#include <iostream>
void SomeClass::SomeFunction()
{
std::cout << "Hello world\n";
}
SomeClass.h -
class SomeClass
{
public:
void SomeFunction();
};
Если вы включите любой из них, вы можете использовать код из него. Однако, если у вас есть несколько файлов, включающих один и тот же файл .cpp, вы можете получить ошибки о переопределении. Заголовочные файлы (файлы .h) обычно содержат только предварительные объявления и не имеют реализаций, поэтому включение их в несколько мест не даст вам ошибок при переопределении.
Если вам как-то удастся скомпилировать без ошибок при включении файлов .cpp из других файлов .cpp, вы все равно можете получить дублированный код. Это происходит, если вы включаете одни и те же файлы .cpp в несколько других файлов. Как будто вы написали функцию дважды. Это увеличит объем вашей программы на диске, займет больше времени на компиляцию и будет работать немного медленнее.
Главное предостережение в том, что это соглашение о реализации / предварительном объявлении не выполняется для кода, использующего шаблоны. Код шаблона будет по-прежнему передаваться вам в виде файлов .h, но он (как правило) реализуется непосредственно в файле .h и не содержит сопровождающих файлов .cpp.