You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SF.12: Prefer the quoted form of #include for files relative to the including file
The current guidance on SF.12 can be over-applied and devolves into "always use <>" because all compilers support adding include directories to the <> search. In this case, even the current directory may be added and so it is always possible to use <> for every header. Applying the guidance then devolves into an undesirable state where <> is always used and include"" is never used.
Instead, the proposed guidance leverages and encourages the distinction between <> and "" to create an easy-to-understand rule that the original guidance hints at and that most developers already follow and understand: "" is for local headers and <> is for library and external headers.
Copy file name to clipboardExpand all lines: CppCoreGuidelines.md
+7-8Lines changed: 7 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -18743,7 +18743,7 @@ Source file rule summary:
18743
18743
* [SF.9: Avoid cyclic dependencies among source files](#Rs-cycles)
18744
18744
* [SF.10: Avoid dependencies on implicitly `#include`d names](#Rs-implicit)
18745
18745
* [SF.11: Header files should be self-contained](#Rs-contained)
18746
-
* [SF.12: Prefer the angle bracket form of `#include` where you can and the quoted form everywhere else](#Rs-incform)
18746
+
* [SF.12: Prefer the quoted form of `#include` for files relative to the including file and the angle bracket form everywhere else](#Rs-incform)
18747
18747
18748
18748
* [SF.20: Use `namespace`s to express logical structure](#Rs-namespace)
18749
18749
* [SF.21: Don't use an unnamed (anonymous) namespace in a header](#Rs-unnamed)
@@ -19182,23 +19182,22 @@ A header should include all its dependencies. Be careful about using relative pa
19182
19182
19183
19183
A test should verify that the header file itself compiles or that a cpp file which only includes the header file compiles.
19184
19184
19185
-
### <a name="Rs-incform"></a>SF.12: Prefer the angle bracket form of `#include` where you can and the quoted form everywhere else
19185
+
### <a name="Rs-incform"></a>SF.12: Prefer the quoted form of `#include` for files relative to the including file and the angle bracket form everywhere else
19186
19186
19187
19187
##### Reason
19188
19188
19189
19189
The [standard](http://eel.is/c++draft/cpp.include) provides flexibility for compilers to implement
19190
19190
the two forms of `#include` selected using the angle (`<>`) or quoted (`""`) syntax. Vendors take
19191
19191
advantage of this and use different search algorithms and methods for specifying the include path.
19192
19192
19193
-
Nevertheless, the guidance is to use the angle form when possible. This supports the fact that the
19194
-
standard library headers must be included this way, is more likely to create portable code, and enables
19195
-
the quoted form for other uses. For example being clear about the locality of the header relative
19196
-
to files that includes it or in scenarios where the different search algorithm is required.
19193
+
Nevertheless, the guidance is to use quoted form for including files that exist at a relative path to the file containing the #include statement and to use the angle bracket form everywhere else where possible. This supports being clear about the locality of the header relative to files that includes it or in scenarios where the different search algorithm is required. For example, it makes it easy to determine at a glance whether a header is being included from a local relative file versus a standard library header or an external header from another project.
19197
19194
19198
19195
##### Example
19199
-
19196
+
foo.cpp:
19200
19197
#include <string> // From the standard library, required form
19201
-
#include "helpers.h" // A project specific file, use "" form
19198
+
#include <some_library/common.h> //A non-local include file from an external library, use the <> form
19199
+
#include "foo.h" // A local file relative to foo.cpp, use "" form
19200
+
#include "utils/foo_utils.h" // A local file relative to foo.cpp, use "" form
19202
19201
19203
19202
##### Note
19204
19203
Failing to follow this results in difficult to diagnose errors due to picking up the wrong file by incorrectly specifying the scope when it is included.
0 commit comments