2

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

例如,我有一个程序 foo.exe 从一个源文件 foo.cpp 编译而来,它们都在同一个目录中。我决定我想把事情组织得更好一点,所以我创建了一个新的 .h 文件 bar.h 并在其中转储东西。我只需要#include 来获取我放在那里的东西吗?如果我想将 bar.h 与另一个程序(在完全不同的目录中)一起使用怎么办?

4

6 回答 6

2

有两种include变体:

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

引用符号:

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

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

您可以通过gcc以下方式获取有关这些路径的一些信息:

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

编译器接受

-I or /I

添加其他路径的选项。

于 2009-11-24T01:12:16.547 回答
1

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

-I您使用或/I在大多数编译器上设置包含路径。有关详细信息,请参阅其手册。

但是,不要在标头中定义任何对象——如果这样做(并将标头包含在多个源文件中),您将在链接时遇到多个定义错误。

于 2009-11-24T01:08:27.337 回答
1

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

希望能帮助到你。

于 2009-11-24T01:10:14.570 回答
1

如果你的头文件在同一个目录中,你可以像这样包含它们:

#include "bar.h"

如果您想从另一个目录中包含此标头:

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

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

于 2009-11-24T01:13:17.980 回答
0

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

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

于 2009-11-24T01:13:37.030 回答
0

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

在 python 中,您可以导入代码并立即对其进行解释。在 c/c++ 中,您将每个源文件编译成一个目标文件。然后,您告诉链接器将一堆目标文件收集到可执行文件中

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

于 2009-11-24T01:17:38.673 回答