Заголовок C ++ и файлы реализации: что включить? - PullRequest
4 голосов
/ 22 мая 2010

Существует файл .h и файл .cpp с тем же именем, но с другим расширением.

Если я хочу использовать то, что находится в файле .cpp, я включаю файл .h или файл .cpp?

Ответы [ 3 ]

23 голосов
/ 22 мая 2010

Простой ответ заключается в том, что вы почти всегда хотите включать файлы .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.

3 голосов
/ 22 мая 2010

Обычно лучше написать в заголовочный файл .h

#ifndef H_someClass
#define H_someClass

class SomeClass {
public:
    void SomeFunction();
};

#endif

, чтобы вы не получили ошибок при переопределении, когда вам нужно включить файл .cpp в другие файлы.

3 голосов
/ 22 мая 2010

Файл .h обычно содержит объявление класса, а файл .cpp - определение класса (реализацию). Вы должны включить .h в файл .cpp.

Хорошее практическое правило - НИКОГДА не включать файл .cpp, поскольку директива #include просто копирует содержимое включенного файла в файл включения. Вы можете закончить множественным включением / определением, и вы определенно не хотите этого делать.

...