I like to put all my #includes in my header file then only include my header for that source file in my source file. What is the industry standard? Are there any draw backs to my method?
C++ – Including #includes in header file vs source file
cfileheaderinclude
Related Topic
- C++ – The Definitive C++ Book Guide and List
- C++ – Why can templates only be implemented in the header file
- Javascript – How to include a JavaScript file in another JavaScript file
- Python – the common header format of Python files
- Where to put include statements, header or source
- C++ – What are the basic rules and idioms for operator overloading
- Python – Why is reading lines from stdin much slower in C++ than Python
- C++ – the difference between ‘typedef’ and ‘using’ in C++11
Best Answer
Generally, you only want to put the minimum necessary includes into a class header file, as anyone else who uses that header will be forced to
#include
all of them too. In larger projects, this leads towards slower builds, dependency issues, and all sorts of other nastiness.Think of a header file as the public interface to your class. You don't want to saddle everyone who uses it with extra dependencies, unless they're necessary to be able to use the class.
Move anything that's only needed in the class implementation down into the source file. For other classes used in a header, only
#include
their headers if you actually need to know their size or contents in the header - anything else and a forward declaration is sufficient. Most cases, you only need to#include
classes you're inheriting from, and classes whose objects are value members of your class.This page has a good summary. (Replicated below for reference)
C++ Header File Include Patterns
Large software projects require a careful header file management even when programming in C. When developers move to C++, header file management becomes even more complex and time consuming. Here we present a few header file inclusion patterns that will simplify this chore.
Header File Inclusion Rules
Here, we discuss the basic rules of C++ header file inclusion needed to simplify header file management.
A header file should be included only when a forward declaration would not do the job. The header file should be so designed that the order of header file inclusion is not important. This is achieved by making sure that
x.h
is the first header file inx.cpp
The header file inclusion mechanism should be tolerant to duplicate header file inclusions. The following sections will explain these rules with the help of an example.Header File Inclusion Example
The following example illustrates different types of dependencies. Assume a class A with code stored in
a.cpp
anda.h
.a.h
a.cpp
File Inclusion Analysis
Lets analyze the header file inclusions, from the point of view of classes involved in this example, i.e.
ABase
,A
,B
,C
andD
.ABase
is the base class, so the class declaration is required to complete the class declaration. The compiler needs to know the size ofABase
to determine the total size ofA
. In this caseabase.h
should be included explicitly ina.h
.A
contains ClassB
by value , so the class declaration is required to complete the class declaration. The compiler needs to know the size of B to determine the total size ofA
. In this caseb.h
should be included explicitly ina.h
.Class C
is included only as a pointer reference. The size or actual content ofC
are not important toa.h
ora.cpp
. Thus only a forward declaration has been included ina.h
. Notice thatc.h
has not been included in eithera.h
ora.cpp
.D
is just used as a pointer reference ina.h
. Thus a forward declaration is sufficient. Buta.cpp
uses classD
in substance so it explicitly includesd.h
.Key Points
Header files should be included only when a forward declaration will not do the job. By not including
c.h
andd.h
other clients of classA
never have to worry aboutc.h
andd.h
unless they use class C and D by value.a.h
has been included as the first header file ina.cpp
This will make sure thata.h
does not expect a certain header files to be included beforea.h
. Asa.h
has been included as the first file, successful compilation ofa.cpp
will ensure thata.h
does not expect any other header file to be included beforea.h
. If this is followed for all classes, (i.e.x.cpp
always includesx.h
as the first header) there will be no dependency on header file inclusion.a.h
includes the check on preprocessor definition of symbol_a_h_included_
. This makes it tolerant to duplicate inclusions ofa.h
.Cyclic Dependency
Cyclic dependency exists between class
X
andY
in the following example. This dependency is handled by using forward declarations.#
x.h and y.h
#