是否存在太多包含路径的问题?

时间:2015-07-16 01:15:32

标签: c++ c++11

在尝试组织我的代码库时,我一直在将文件移动到文件夹层次结构中 e.g:

  
      
  • 文件夹A.      
        
    • 文件夹AA      
          
      • Foo.cpp中
      •   
      • Foo.hpp
      •   
    •   
  •   
  • 文件夹B
  •   
  • 文件夹C.      
        
    • 文件夹CA.      
          
      • Bar.cpp
      •   
      • Bar.hpp
      •   
    •   
  •   
  • 文件夹D
  •   
  • 文件夹E
  •   

虽然它使查找单个文件变得更容易,但它使得引用它们变得更加困难。对于Bar.cpp来引用Foo.hpp,我必须在头文件中放置一个相对路径:

#include "../../Folder A/Folder AA/Foo.hpp"

最初我每次需要引用文件时都会这样做,但它不仅看起来很丑陋而且非常脆弱。每当我决定重新组织文件时,它都会破坏对该文件的每次引用。

要解决这个问题,我正在考虑添加一个包含路径(-I),以便将上面的include语句简化为:

#include "Foo.hpp"

如果我为文件夹层次结构中的每个文件夹添加包含路径(我有大约9个),是否会对编译产生重大影响?这是一个很好的做法吗?在这种情况下,业内人士做了什么?

4 个答案:

答案 0 :(得分:1)

我想通常的做法是要在include路径中包含根文件夹。这样你可以使用相对于root的路径:

#include "Folder A/Folder AA/Foo.hpp"

这是根文件夹是“文件夹A”所在的位置。我认为应该解决它,但为了完整起见,我可能会在搜索路径中添加额外的文件夹,这可能会增加编译器查找文件时的复杂性,因为在执行此操作时必须查看更多文件夹。然而,性能损失是如此绝对边缘,甚至可能甚至没有一个剖析器反映它。请注意,任何现代计算机都可以在“纳米眨眼间”查看9个文件夹中的文件。

我可能只是添加一个额外的建议:不要过度使用文件结构。除非您的项目要增长到数百或数千个文件,否则您可能不需要。如果确实如此,最好考虑将其分解为更小的模块。

答案 1 :(得分:1)

我认为没有任何一种方法可以解决这个问题,但是我所看到的最好的工作方案是;

  1. 你的。如您所述,只需将头文件保留为源代码,并让Makefile具有-I选项中列出的所有目录 - 编译时没有任何明显的性能问题。问题在于维护makefile中的列表,但如果需要,可以使用某些宏自动执行。

  2. 将包含源代码的.h文件和符号链接所有.h文件保存到项目中的/include目录中。您可以将符号链接自动化为Makefile的初始步骤,这样您就不必保持最新状态。

  3. 在任何一种情况下,项目约定都很重要,所以如果您的项目不必与任何内容集成,您可以自由地执行您想要的任务,但如果您正在为其他系统创建程序包,则应遵循它们具有的任何约定已经出发了。

答案 2 :(得分:0)

如果Foo.cpp和Bar.cpp都需要包含Foo.hpp,那么您将Foo.hpp放入一个公共包含文件夹,然后您的Makefile中包含该文件夹包含路径。

答案 3 :(得分:0)

您可以将所有头文件保存在一个目录中。确保您的头文件具有标题保护,这样您可以节省您的时间,而不是在循环引用或其他相关问题上挣扎。并创建一个makefile来管理您的构建过程。使用选项-I使用make实用程序时,您可以指定包含路径。