0

我是 C++ 新手,并试图了解它是如何查找标头的。最初我只是想找出哪些类可供我包含在我的源代码中。我相信不同的编译器会使用不同的包含目录,因此类的可用性会有所不同。我的计划是找到编译器正在使用的“包含”目录,并假设我可以在其中包含任何内容。所以我只是在我去的时候变得更加困惑。

首先,我在 Windows 7 上的 Code::Blocks 中编写 C++ 代码。IDE 设置为使用 GNU GCC 进行编译,我了解到这意味着它使用 G++ 编译器来编译 C++ 代码。我在这里找到了我的编译器:C:\MinGW\bin\mingw32-g++.exe,Code::Blocks 设置指向那个。

所以我假设 G++ 必须递归地使用 C:\MinGW\include 来查找它的所有头文件。为了测试我的理论,我搜索了“iostream.h”。令我惊讶的是,我的 C 盘上什至没有“iostream.h”。尽管如此,当我包含它时,我的代码仍然可以编译和工作。

所以我的问题:

  1. 当我的硬盘驱动器甚至没有 iostream 标头时,G++ 如何找到它?

  2. 所有 C++ 编译器都可以使用所有标准 C++ 头文件(如下所列:http: //msdn.microsoft.com/en-us/library/ct1as7hw.aspx )吗?具有相同的确切名称,所以我不必更改我的源代码?

4

4 回答 4

3

关于第二个问题,该标准不要求标头可作为文件使用。它要求#include指令出现在程序中,并且编译器的行为就像标准所需的声明出现在程序中一样。但是编译器可以自由地以它认为合适的任何方式注入声明。

话虽如此,g++ 确实有文件备份每个标题。在不知道您的特定配置的情况下,我无法告诉您标头的位置,但您可以在预处理器之后停止编译过程并检查输出:

$ cat test.cpp
#include <iostream>
int main() {
   std::cout << "Hi\n";
}
$ g++ -E test.cpp | head -10
# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.cpp"
# 1 "/usr/include/c++/4.2.1/iostream" 1 3
# 42 "/usr/include/c++/4.2.1/iostream" 3

# 43 "/usr/include/c++/4.2.1/iostream" 3

上面的路径是在 MacOSX Lion 上,它表明在这个特定的配置iostream中包含来自/usr/include/c++/4.2.1/iostream. 在 windowshead中可能不可用,但您可以将输出重定向到文件并从那里读取。

于 2012-06-02T01:03:29.740 回答
1
  1. 使用引号将在移动到使用尖括号搜索的目录之前搜索当前目录。除了 中列出的文件之外,还有其他目录\include。在那里你会找到那些没有任何扩展名的。您可能c++在其中有一个包含这些文件的文件夹,但即使使用 Windows 7 搜索从 CodeBlocks 目录中搜索它们也会显示它们所在的位置。

  2. 是的,它们都应该可以使用相同的名称访问,使用尖括号包含来访问它们。当然,总有一些可能会丢失的可能性很小。如果是这种情况,乍一看,这种实现似乎非常不可靠。今天所有主要的编译器都应该坚持这一点。

要在类中使用您自己的头文件,它们应该与主 cpp 文件位于同一目录中,并且您应该使用引号包含。

于 2012-06-02T00:52:16.753 回答
1

1) 找不到 iostream.h 的原因是没有这样的头文件,它是iostream用标准 C++ 拼写的。如果你尝试#include <iostream.h>它会失败,所以它不会找到你没有的标题:)

如果您运行g++ -v test.cpp,它将显示编译时用于查找标头的所有路径test.cpp

2)是的,如果它们丢失或根据您的编译器具有不同的名称,它们将不是标准头文件!

于 2012-06-02T01:13:34.723 回答
0

答案 1:我使用 Code::Blocks 的时间很短,但我记得在 Dev-C++ 和 MSVC++ 中,头文件位于 IDE 的目录中。(例如,我的 MSVC++ 包含目录在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include 中,它有 iostream 文件。)

答案 2:最常见的头文件在最常见的 IDE/编译器集中。

提示:您不是说“iostream”而不是“iostream.h”吗?

于 2012-06-02T00:57:38.753 回答