Есть файл .h и файл .cpp с одинаковым именем, но с другим расширением.
Если я хочу использовать то, что находится в файле .cpp, включаю ли я файл .h или файл .cpp?
Есть файл .h и файл .cpp с одинаковым именем, но с другим расширением.
Если я хочу использовать то, что находится в файле .cpp, включаю ли я файл .h или файл .cpp?
Простой ответ заключается в том, что вы почти всегда хотите включать файлы .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.
Файл .h обычно содержит объявление класса, а файл .cpp — определение класса (реализация). Вы должны включить .h в файл .cpp.
Хорошее эмпирическое правило — НИКОГДА не включать файл .cpp, потому что директива #include
просто копирует содержимое включаемого файла во включаемый файл. Вы можете закончить с каким-то множественным включением/определением, и вы определенно не хотите этого делать.
Обычно лучше писать в заголовочном файле .h
#ifndef H_someClass
#define H_someClass
class SomeClass {
public:
void SomeFunction();
};
#endif
так что вы не получите ошибок о переопределении, когда вам нужно включить файл .cpp в другие файлы.
.h
, как правило, включаются, тогда как файлы.cpp
обычно передаются непосредственно компилятору. 05.03.2013