C++ 如何处理多个源文件?

问题描述 投票:0回答:6

我现在正在学习 C++,有 Python 背景,但在理解 C++ 如何处理多个源文件方面遇到了一些困难。在 Python 中,导入语句首先检查您尝试导入的模块的当前工作目录,然后检查 sys.path 中的目录。在 C++ 中,我应该在哪里放置自定义的 .h 文件?编译器会在哪里查找?

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

c++ header-files
6个回答
2
投票

有两种

include
变体:

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

引用符号:

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

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

使用

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

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

编译器接受

-I or /I

添加额外路径的选项。


1
投票

如果您使用

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

在大多数编译器上,您可以使用

-I
/I
设置包含路径。详情请参阅其手册。

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


1
投票

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

希望有帮助。


1
投票

如果您的头文件位于同一目录中,您可以像这样包含它们:

#include "bar.h"

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

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

基本上引号意味着从当前目录搜索,而像

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


0
投票

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

#include <iostream>

使用双引号,它会在当前目录和提供给编译器进行搜索的其他目录中查找。

#include "foo.h"
g++ -I../include foo.cpp


0
投票

Python 模型中缺少的是链接器。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.