2014-03-30 137 views
5

我发现#include "../app/thing.h"很丑陋,我希望能够从我的项目的主要根源导入,就像这样:C++包括完整路径

#include <project/app/submodule/thing.h>

(我知道<>一般使用外部但我觉得它非常干净)

我该如何做到这一点,从我的项目中的任何地方?

+2

请参阅[相对路径有什么好处,例如'“../ include/header.h”'头部?](http://stackoverflow.com/questions/597318/) - TL; DR ,没有太多的好处,有负债。 –

+2

对于始终在一起移动的文件使用相对路径只是常识。对于那些,你必须使用“”。 – Deduplicator

+0

好吧,你们两个相信我,我会走相对路径... – valentin

回答

3

您只需确保您的构建过程设置了一个选项来指定搜索的起点。

例如,如果你的标题是:

/work/username/src/project/app/submodule/thing.h 

则需要包括(假定一个符合POSIX标准的编译器; AFAICR,甚至MSVC使用/I作为-I模拟):

-I/work/username/src 

作为编译器选项之一。您可以在项目中的任何地方使用该路径,因为它是绝对的。您只需要为构建系统定义一个方法来知道该设置应该是什么,以便当它移动到/home/someone/src/时,您只有一个设置需要更改。

+0

对于每一个编译器,它不一定是'-I'。 –

+0

指定一个关闭Windows的编译器,它不是'-I'?我已经给答案添加了一个警告 - 并提到我相信Windows使用'/ I',因为那里的选项以'/'而不是'-'开头。 –

+0

我还没有遇到过一个不使用'-I'的编译器,但是当然有可能编译器没有。即使MS编译器也采用-I(即使他们更喜欢/ I) –

1

您可以简单地使用当前编译器的include目录选项(通常为-I)来实现此目的。

另请注意,使用""双引号只会添加到编译器标准头文件的回退中。使用<>包含的文件只能保证从编译器标准头文件搜索文件。

+3

这是错的! “”回落到<>,而不是相反。虽然“”应该包括文件相对模式作为第一个搜索,但只有保证找到标准头文件。 – Deduplicator

+1

@Deduplicator THX用于指出。我试图修复...... –

1

请参阅this answer了解有关两种格式之间差异如何工作的更完整说明。老实说,我想你可能会考虑重构你的文件夹层次结构,如果你需要跳过一个文件夹然后跳转到另一个文件夹来获得一些东西。一般来说,在文件夹结构中(即在同一个文件夹中)将所有文件保存在本地的程序本地,以及所有非本地文件但可能需要的文件(例如在主程序文件夹内的子文件夹中,或在编译时包含它们。

需要注意的是,在上面链接的答案中,它解释了“<>”包含“实现相关”,所以我们确实需要知道您使用的是什么编译器来告诉您是否可以或不能这样做。