我正在学习C ++,来自Python的背景,我在理解C ++如何处理多个源文件方面遇到了一些麻烦。在Python中,import语句首先检查您尝试导入的模块的当前工作目录,然后检查sys.path中的目录。在C ++中,我将在哪里放置自定义的.h文件?编译器甚至会在哪里看?
例如,我有一个程序,foo.exe从单个源文件foo.cpp编译,两者都在同一目录中。我决定要把事情组织得更好一些,所以我创建了一个新的.h文件,bar.h并在那里转储东西。我只需要#include来获取我放在那里的东西吗?如果我想将bar.h与另一个程序(在完全不同的目录中)一起使用该怎么办?
答案 0 :(得分:2)
有两种include
变体:
#include "path-spec"
#include <path-spec>
引用符号:
此表单指示预处理器在包含#include语句的文件的同一目录中查找包含文件,然后在包含(#include)该文件的任何文件的目录中查找。
括号表示法在某些已定义的位置查找头文件。
使用gcc
,您可以通过以下方式获取有关这些广告的一些信息:
$ echo | gcc -v -x c++ -E -
编译器接受
-I or /I
添加其他路径的选项。
答案 1 :(得分:1)
如果您使用#include <foo>
,它(通常)会在包含路径中查找,否则如果您使用#include "../../foo/bar.h"
则会使用相对路径。
您在大多数编译器上设置包含-I
或/I
的路径。有关详细信息,请参阅其手册。
不要在标题中定义任何对象 - 如果你这样做,你会在链接时有多个定义错误(并在多个源文件中包含标题)。
答案 2 :(得分:1)
它以类似的方式工作。 #include仅供编译器使用。在执行时,文件bar.h不会被使用。但在编译时它是。
在编译时,文件可以在两个地方:
1.-当前目录(如python中)
2.-包含路径中配置的目录。配置目录的位置取决于您使用的编译器。其中大多数允许您在编译命令行中定义include目录。大多数IDE允许您在某些“选项”菜单中对其进行配置。
希望它有所帮助。
答案 3 :(得分:1)
如果您的头文件位于同一个目录中,您可以将它们包括在内:
#include "bar.h"
如果你想从另一个目录中包含这个标题:
#include "../foobar/bar.h"
基本上引用意味着从当前目录搜索,而#include <abc.h>
中的括号意味着在标准头文件目录中搜索。您可以通过在编译命令中添加-I /path/to/your/custom/headers
将自定义目录添加到标准搜索路径。
答案 4 :(得分:0)
带有尖括号的#include在系统包含目录中查找。像这样:
#include <iostream>
使用双引号,它会查看当前目录以及给编译器搜索的其他目录
#include "foo.h"
g++ -I../include foo.cpp
答案 5 :(得分:0)
你在python模型中缺少的是链接器。
在python中导入代码并在那里解释它。在c / c ++中,您将每个源文件编译为目标文件。然后,您告诉链接器将一堆目标文件收集到可执行文件中
通常,c / c ++源文件中的包含仅包含其他C文件中的whast(函数名称等)的描述,而不包含函数内容。这足以让编译器编译给定的文件。然后链接器将您的目标文件与“众所周知”的函数库组合在一起并生成可执行文件