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
Copy file name to clipboardexpand all lines: CppCoreGuidelines.md
+9-9
Original file line number
Diff line number
Diff line change
@@ -18794,7 +18794,7 @@ Source file rule summary:
18794
18794
* [SF.9: Avoid cyclic dependencies among source files](#Rs-cycles)
18795
18795
* [SF.10: Avoid dependencies on implicitly `#include`d names](#Rs-implicit)
18796
18796
* [SF.11: Header files should be self-contained](#Rs-contained)
18797
-
* [SF.12: Prefer the angle bracket form of `#include` where you can and the quoted form everywhere else](#Rs-incform)
18797
+
* [SF.12: Prefer the quoted form of `#include` for files relative to the including file and the angle bracket form everywhere else](#Rs-incform)
18798
18798
18799
18799
* [SF.20: Use `namespace`s to express logical structure](#Rs-namespace)
18800
18800
* [SF.21: Don't use an unnamed (anonymous) namespace in a header](#Rs-unnamed)
@@ -19236,27 +19236,27 @@ A header should include all its dependencies. Be careful about using relative pa
19236
19236
19237
19237
A test should verify that the header file itself compiles or that a cpp file which only includes the header file compiles.
19238
19238
19239
-
### <a name="Rs-incform"></a>SF.12: Prefer the angle bracket form of `#include` where you can and the quoted form everywhere else
19239
+
### <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
19240
19240
19241
19241
##### Reason
19242
19242
19243
19243
The [standard](http://eel.is/c++draft/cpp.include) provides flexibility for compilers to implement
19244
19244
the two forms of `#include` selected using the angle (`<>`) or quoted (`""`) syntax. Vendors take
19245
19245
advantage of this and use different search algorithms and methods for specifying the include path.
19246
19246
19247
-
Nevertheless, the guidance is to use the angle form when possible. This supports the fact that the
19248
-
standard library headers must be included this way, is more likely to create portable code, and enables
19249
-
the quoted form for other uses. For example being clear about the locality of the header relative
19250
-
to files that includes it or in scenarios where the different search algorithm is required.
19247
+
Nevertheless, the guidance is to use the quoted form for including files that exist at a relative path to the file containing the `#include` statement (from within the same component or project) and to use the angle bracket form everywhere else, where possible. This encourages being clear about the locality of the file relative to files that include it, or scenarios where the different search algorithm is required. It makes it easy to understand at a glance whether a header is being included from a local relative file versus a standard library header or a header from the alternate search path (e.g. a header from another library or a common set of includes).
19251
19248
19252
19249
##### Example
19253
19250
19254
-
#include <string> // From the standard library, required form
19255
-
#include "helpers.h" // A project specific file, use "" form
19251
+
// foo.cpp:
19252
+
#include <string> // From the standard library, requires the <> form
19253
+
#include <some_library/common.h> // A file that is not locally relative, included from another library; use the <> form
19254
+
#include "foo.h" // A file locally relative to foo.cpp in the same project, use the "" form
19255
+
#include "foo_utils/utils.h" // A file locally relative to foo.cpp in the same project, use the "" form
19256
19256
19257
19257
##### Note
19258
19258
19259
-
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.
19259
+
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. For example, in a typical case where the `#include ""` search algorithm may search for a file existing at a local relative path first, then using this form to refer to a file that is not locally relative could mean that if a file ever comes into existence at the local relative path (e.g. the including file is moved to a new location), it will now be found ahead of the previous include file and the set of includes will have been changed in an unexpected way.
19260
19260
19261
19261
Library creators should put their headers in a folder and have clients include those files using the relative path `#include <some_library/common.h>`
0 commit comments