2009-11-24 138 views
2

我正在学习C++,来自Python的背景,并且我在理解C++如何处理多个源文件时遇到了一些麻烦。在Python中,导入语句首先检查当前工作目录是否要导入模块,然后检查sys.path中的目录。在C++中,我会在哪里放置一个自定义的.h文件?编译器甚至会在哪里看?C++如何处理多个源文件?

例如,我有一个程序,foo.exe是从同一个目录下的单个源文件foo.cpp编译的。我决定要组织一些更好的东西,所以我创建了一个新的.h文件,bar.h并在其中存储了一些东西。我只需要#include来获得我放在那里的东西?如果我想将bar.h与其他程序一起使用(在完全不同的目录中),该怎么办?

回答

2

有两种include变种:

#include "path-spec" 
#include <path-spec> 

引用符号:

这种形式指示预处理寻找包括在包含#include语句的文件的同一目录下的文件,然后在包含(#include)该文件的任何文件的目录中。

括号表示法在某些定义的位置查找头文件。

随着gcc您可以通过获取有关这些pathes的一些信息:

$ echo | gcc -v -x c++ -E - 

编译器接受

-I or /I

选项添加额外的pathes。

1

如果您使用#include <foo>,它(通常)会在包含路径中查找,否则,如果使用#include "../../foo/bar.h",则会使用相对路径。

您在大多数编译器上设置包含路径-I/I。详情请参阅其手册。

不要在头文件中定义任何对象 - 如果你这样做(并且在多个源文件中包含头文件),你将在链接时有多个定义错误。

1

它以相似的方式工作。 #include仅供编译器使用。在执行时间文件bar.h不会被使用。但在编译时就是这样。
在编译时,文件可能位于两个位置:
1.-当前目录(如python)
2.-在包含路径中配置的目录。何处配置该目录取决于您正在使用的编译器。它们中的大多数允许您在编译命令行中定义include目录。大多数IDE允许您在一些选项菜单中对其进行配置。

希望它有帮助。

1

如果你的头文件在同一目录中,您可以包括他们喜欢:

#include "bar.h" 

如果要包括来自另一个目录此标题:

#include "../foobar/bar.h" 

基本上报价意味着搜索从当前目录和方括号,如#include <abc.h>的意思是在标准头文件目录中搜索。您可以通过在编译命令中添加-I /path/to/your/custom/headers将自定义目录添加到标准搜索路径。

0

#包含尖括号在系统包含目录中查找。像这样:
#include <iostream>

使用双引号时,它会在当前目录和其他目录中寻找编译器进行搜索。
#include "foo.h"
g++ -I../include foo.cpp

0

你在python模型中缺少的东西是链接器。

在python中你导入代码及其解释权在那里。在c/C++中,你可以将每个源文件编译成一个目标文件。然后您告诉链接器将一堆目标文件收集到可执行文件中

通常,c/C++源文件中的包含仅包含其他C文件(函数的名称等)中的whast的描述,而不包含函数内容。这足以让编译器编译给定的文件。然后,链接器将您的目标文件与“知名”函数库结合起来,并生成可执行文件