比实际需要的#include路径更长吗?

问题描述:

举例来说,如果我有一个名为foo.h中的文件,可我永远都只是包括它做:比实际需要的#include路径更长吗?

#include "foo.h" 

或者我有时不得不做这样的事情:

#include "bar/foobar/foo.h" 

编辑 - 他们只是简单地通过限制搜索文件来缩短编译时间吗?

+0

您似乎认为编译器会搜索子目录,如果它没有在任何包含目录中找到该文件。什么让你有那个想法? – sepp2k 2012-03-01 17:27:37

编译器不会递归搜索您的源目录。如果你想使用#include "foo.h",你需要编译-Ibar/foobar告诉编译器它应该在bar/foobar查找头文件。

否则,您将不得不使用完整(相对)路径。我倾向于更喜欢-I,因为它使得源代码更加独立于编译器标志(当在构建系统之间进行切换时,您会体会到这一点)。

可能有多个头文件具有相同名称的情况 - 在这种情况下,路径有助于消除歧义。

+0

是的,这就是我现在拥有的。如何编写这些简单的路径以及它们的含义实际上是我从未学过的东西。我该如何谷歌找出这个? – SirYakalot 2012-03-01 17:33:51

我认为这取决于您的项目设置,例如您在Visual C++中有“Additional Include Directories”部分,因此IDE也将搜索这些目录中的文件。

基本上,您可以将包含路径作为选项传递给C++编译器,但它不会以递归方式查找该文件。如果您在路径/opt/include通过做“#include "foo.h",它将_ only_发现/opt/include/foo.h,不/opt/include/dummy/foo.h

换句话说,无论你通过每一个可能包括在命令行的路径,或通过根和”导航“通过使用#include "dummy/foo.h"

编辑:@MatthieuM做出如下换个好点,#include "mylibrary/api.h"使其更加清晰,其中包括你正在使用的不仅仅是#include "api.h"文件,特别是如果你使用多个库

+0

个人说明:我更喜欢手动导航,更容易从特定包含的来源中看到。 – 2012-03-01 17:29:48

+0

@MatthieuM。是的,在这里也是一样,'#include'mylibrary/api.h''为了可读性而在任何一天都打#include“api.h”。 – 2012-03-01 17:32:55

的。第一条语句#include“foo.h”将搜索foo.h中的当前工作目录或在其他包含目录下提到的目录中。

如果您的头文件位于其他路径中,则需要明确提及它。

+0

所以普通的#include会搜索当前文件所在的同一个目录,并且...向后..?我对此有点困惑。 – SirYakalot 2012-03-01 17:32:15

+0

我的理解是,编译器会移动2个层次并尝试查找bar目录。然后在它里面检查foo目录然后foo.h – 2012-03-01 17:38:48