Используйте заголовочные файлы, когда вам нужно обмениваться информацией между несколькими исходными файлами.Тщательно используемый заголовочный файл обеспечит согласованность между файлом, определяющим некоторые функции, и другими файлами, использующими эту функцию.
Когда программа состоит из одного (исходного) файла, создавать заголовок не нужно.Когда программе требуется более одного исходного файла (скажем, двух исходных файлов), между этими двумя файлами должна быть хотя бы одна функция или переменная «общая» (потому что если бы этого не было, один из файлов был бы избыточным).У вас должен быть заголовок для описания совместно используемой функции или переменных, чтобы производитель и потребитель согласовали общую функциональность.
Следствие заключается в том, что заголовок не должен описывать ничего, что не нужно потребителям функциональности.Просто потому, что реализация должна использовать какой-то второй заголовок, потребитель не должен включать его.Если второй заголовок предоставляет определения, используемые в интерфейсе, то он действительно должен быть включен в общий заголовок.
ОК - много словоблудия.Конкретный пример:
source1.h
extern int somefunc(int, int);
source1.cpp
#include "source1.h"
int somefunc(int a, int b)
{
return a + b;
}
program.cpp
#include <iostream>
#include "source1.h"
using namespace std;
int main()
{
int x = somefunc(1, 3);
cout << "somefunc(1, 3) is " << x << endl;
}
Заголовок здесьНеобходимо обеспечить уверенность в том, что все соответствует.И source1.cpp
, и program.cpp
должны включать заголовок для обеспечения согласованности.
Обратите внимание, что если бы somefunc()
было определено в program.cpp
, не было бы никакого смысла в предоставлении заголовка.
Теперь предположим, что мы изменили somefunc()
:
source1.cpp - исправлено
#include "source1.h"
#include <iostream>
using namespace std;
int somefunc(int a, int b)
{
cout << "a = " << a << ", b = " << b << endl;
int x = a + b;
cout << "x = " << x << endl;
return x;
}
Внешне вы можете изменить source1.h
, чтобы оно включало <iostream>
, но это было бы плохопереехать.Интерфейс определенной функции, somefunc()
, не зависит от <iostream>
, поэтому заголовок не должен включать <iostream>
.