【问题标题】:C++ Header styleC++ 标题样式
【发布时间】:2011-11-09 09:19:30
【问题描述】:

C++ 项目中头文件的首选策略是什么:<test.h>"test.h"? 根据我的经验,我使用:

  1. #include <test_lib.h> 包含项目设置中指定路径的 C/C++ 头文件、第三方库(boost 等)。
  2. #include "my_test.h" - 用于项目中存在的头文件。

这里可以应用任何其他做法吗?

是否可以包含具有相对路径的头文件:例如#include "../new_test.h"?还是将相对路径移动到项目设置更好?

【问题讨论】:

    标签: c++ header include


    【解决方案1】:

    尖括号用于包含系统标题。从理论上讲,IIRC,它们甚至不一定是文件。在实践中,<> 表示搜索当前目录,只搜索包含路径,而"" 表示在当前目录中查找,然后搜索包含路径。

    至于相对路径,可能取决于您的环境,我建议相对于您的项目的路径包含路径(由-I 指定)。

    【讨论】:

    • 编译器cl、gcc有区别吗?
    • 我不会赌我的最低欧元,但就像我说的,实际上大多数实现都遵循上述相同的过程。
    【解决方案2】:

    This MSDN 文章解释了预处理器如何根据#include 语法形式搜索标头。您的风格很好,因为 Visual C++、Windows 框架、Boost 和其他框架/包的标头(通常)在您的项目目录之外。

    关于你的第二个问题,我的建议是避免相对路径。如果您移动该标题,则需要通过更改代码来调整该相对路径,这是一个坏主意。我宁愿把它放在尖括号内,并将它的路径添加到/I 选项。例如。你想在你的项目中包含C:\frameworks\frameworkA\include\a.h,你可以使用#include <a.h>\I "C:\frameworks\frameworkA\include"

    如果您将框架根目录的路径添加到/I,然后将其标题的部分路径放在尖括号内,则可能更具描述性。例如。 #include <frameworkA\include\a.h>/I "C:\frameworks"。现在在代码中很明显a.h 属于frameworkA

    仅对项目目录中的标头使用相对路径(例如,如果您将代码组织到位于项目子目录中且不打算移动的模块中)。

    【讨论】:

    • +1 用于描述性包含位,当项目依赖多个库时真的很有帮助!
    • 关于 MSDN 主题,您能否澄清以下声明:“在任何先前打开的包含文件的目录中,以打开它们的相反顺序。搜索从包含文件的目录开始最后打开并继续通过首先打开的包含文件的目录。"
    • 老实说,我从来没有依赖过这条规则,但我猜 VC 编译器通过将所有先前解析的路径放入堆栈来“记住”所有先前解析的路径。如果在步骤 1 中未找到标头,则预处理器通过从堆栈顶部开始使用这些记住的路径,那里是最近的路径。恕我直言,这条规则 (2) 引入了一些混淆,因为它允许所有具有先前解析路径的标头都可以包含在引用的语法中。例如,假设 b.hc.hC:\foo 中,并且您有 #include "a.h" #include <b.h> #include "c.h" 和 @ 987654339@.c.h 将在为b.h 解析的路径上找到。
    【解决方案3】:
    1. 您可以使用其中任何一个。编译时可以使用-I <directory containing test.h> 选项来使用<test.h>。一般来说,这是我遵循的一种做法,我倾向于对所有头文件使用<test.h>,无论它们是第三方头文件还是我编写的头文件。

    2. 最好不要使用相对路径"../test.h"。根据个人经验,这种编写#include 语句的方式会迫使您巩固您的目录结构。如果您决定明天将test.h 移动到不同的目录,则必须进入每个头文件并将test.h 的相对路径更改为新路径——这是一项耗时的练习。最好将它转移到makefile(通过-I),然后从那里处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-16
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2016-01-03
      相关资源
      最近更新 更多