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