在尝试组织我的代码库时,我一直在将文件移动到文件夹层次结构中 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个),是否会对编译产生重大影响?这是一个很好的做法吗?在这种情况下,业内人士做了什么?
答案 0 :(得分:1)
我想通常的做法是要在include路径中包含根文件夹。这样你可以使用相对于root的路径:
#include "Folder A/Folder AA/Foo.hpp"
这是根文件夹是“文件夹A”所在的位置。我认为应该解决它,但为了完整起见,我可能会在搜索路径中添加额外的文件夹,这可能会增加编译器查找文件时的复杂性,因为在执行此操作时必须查看更多文件夹。然而,性能损失是如此绝对边缘,甚至可能甚至没有一个剖析器反映它。请注意,任何现代计算机都可以在“纳米眨眼间”查看9个文件夹中的文件。
我可能只是添加一个额外的建议:不要过度使用文件结构。除非您的项目要增长到数百或数千个文件,否则您可能不需要。如果确实如此,最好考虑将其分解为更小的模块。
答案 1 :(得分:1)
我认为没有任何一种方法可以解决这个问题,但是我所看到的最好的工作方案是;
你的。如您所述,只需将头文件保留为源代码,并让Makefile具有-I
选项中列出的所有目录 - 编译时没有任何明显的性能问题。问题在于维护makefile中的列表,但如果需要,可以使用某些宏自动执行。
将包含源代码的.h
文件和符号链接所有.h
文件保存到项目中的/include
目录中。您可以将符号链接自动化为Makefile的初始步骤,这样您就不必保持最新状态。
在任何一种情况下,项目约定都很重要,所以如果您的项目不必与任何内容集成,您可以自由地执行您想要的任务,但如果您正在为其他系统创建程序包,则应遵循它们具有的任何约定已经出发了。
答案 2 :(得分:0)
如果Foo.cpp和Bar.cpp都需要包含Foo.hpp,那么您将Foo.hpp放入一个公共包含文件夹,然后您的Makefile中包含该文件夹包含路径。
答案 3 :(得分:0)
您可以将所有头文件保存在一个目录中。确保您的头文件具有标题保护,这样您可以节省您的时间,而不是在循环引用或其他相关问题上挣扎。并创建一个makefile来管理您的构建过程。使用选项-I
使用make实用程序时,您可以指定包含路径。