Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


On 10/06/2017 11:26 AM, Kaganski Mike wrote:
Here I propose an updated rule to follow in the use of includes in the
project's code:

1. Use *only* <> syntax for any include that resides in include paths
explicitly defined in the module's mk file (gb_Library_set_include),
global includes ($INCLUDE), e.g., /include, and system headers (<vector>
or <Windows.h>) - these are interface headers.
As all implementations agree to use both implementation include places
and -I-defined places as search paths for <> syntax, this will likely
not allow inconsistency problems (and is actually what is used now in
most of the code).

2. Use *only* <> syntax for includes inside headers that reside in such
places (e.g., no header in /include should include other headers using
"" itself). This is aimed to prevent cases where some header placed in
the current source's directory would conflict with an include referred
from a global interface header.

3. *Always* use "" syntax *only* for includes that refer to headers
placed next to the current source in the same directory (or
subdirectories), i.e. that would be found using the "." entry of -I
switch. These are implementation headers. This applies to both includes
in c[xx] files as well as in h[xx] residing in directories like
/sw/source/core/access (as opposed to those in /sw/inc).

What happened to get implemented now with the help of a rewriting loplugin:includeform is slightly different:

  Use the "..." form if and only if the included file is found next to
  the including file.  Otherwise, use the <...> form.

More technically: Use the "p" form if and only if the "perceived" (i.e., as potentially modified through #line directives) absolute path of the including file is p'/f (with f being just a file name, not a multi-segment path), and the absolute path of an included file can be written as p'/p (with p potentially being a multi-segment relative path).

This is independent of whether the including file is the translation unit's main source file (".cxx") or itself an include file (".hxx"). And that is how the actual rules differ from rule (2) of the three original rules quoted above. (Though in practice include files in the include/ tree will still reference other include files with the <...> form, even with the modified rules, due to the hierarchical structure of the include/ tree and the way such includes are written with relative paths, include/foo/bar.hxx using #include <foo/baz.hxx> notation, not #include "baz.hxx".)

The original rule (2) rationale "to prevent cases where some header placed in the current source's directory would conflict with an include referred from a global interface header" should be a non-issue anyway: For the "..." form, all compilers first search next to the including file itself, so actually including a file that can be found that way is safe from any clashes. MSVC then additionally searches next to each file in the "include stack", so that sloppily written Windows-only code could accidentally use "..." when it should actually use <...>, but loplugin:includeform will then find that blunder (when at least I occasionally run the Clang plugins on Windows).

(The reason to use the potentially #line-modified, "perceived" pathname is more of an aesthetic than a technical nature; it would look odd to reference include files next to a flex or bison source file with <...> instead of "...", different from how those would be written for a genuine C/C++ source file.)

The loplugin:includeform remains enabled (in a non-rewriting mode), so Jenkins may occasionally block your Gerrit changes for a wrong choice of "..." vs. <...> include form. However, as the now-redundant -I switches that make the current translation unit's path be searched for the <...> form are removed, chances that such wrong choices would not already be found by a local (non-Clang-plugins) build should be low.

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.