c/c++ 相对包含路径 vs Makefile 包含标志

kom*_*nja 5 c c++ makefile build

在具有以目录树结构构建文件的大型项目中,是在源文件中包含相对路径更好,还是仅包含头文件并通过 Makefile 指示编译器在哪里找到它?
有没有首选的方法?

例子:

#include "../path/to/file.h"  
Run Code Online (Sandbox Code Playgroud)

对比

#include "file.h"
gcc -I../path/to  
Run Code Online (Sandbox Code Playgroud)

我相信第一种情况可能更具可读性,而第二种方法可以无缝移动文件......

too*_*ite 4

这取决于。对于项目中的包含文件,给出相对路径可能很有用,因为子目录是另一个结构元素,您不必关心相同的文件名(主要针对 C++,因为 C 不支持自定义命名空间)。

对于外部路径(例如其他项目),您应该明确使用第二种方法。可能只是到该结构的根部。如同asm/byteorder.h

无论如何,如果使用显式路径(在源文件中),您应该确保它们有详细记录,并且任何更改都会跟踪到源文件。(经常会有公共子目录,比如config等,不会改变)。

一个强烈的建议:始终使用项目根目录作为工作目录。所有显式相对路径均来自此根。这样您就可以避免有问题的父 ( ..) 路径。

最终规则是不要使用跨越项目根目录的显式路径。

然而,没有其他一般规则。实际的布局往往取决于个人喜好。如果目录结构经过深思熟虑,我更喜欢显式路径。