G ++如何找到我没有的标题?

时间:2012-06-02 00:45:14

标签: c++ header g++ codeblocks

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

首先,我在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. 当我的硬盘驱动器甚至没有它时,G ++如何找到iostream标头?

  2. 所有标准C ++标头(如此处列出:http://msdn.microsoft.com/en-us/library/ct1as7hw.aspx)是否可供所有C ++编译器使用?具有相同的名称,所以我不必更改我的源代码?

4 个答案:

答案 0 :(得分: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。在Windows head中可能无法使用,但您可以将输出重定向到文件并从那里读取。

答案 1 :(得分:1)

  1. 使用引号将搜索当前目录,然后转到使用尖括号搜索的目录。除了\include中列出的文件之外,还有其他目录。那就是你可以找到没有任何扩展的那些。你可能有一个c++文件夹,里面有这些文件,但即使使用Windows 7搜索从CodeBlocks目录中搜索它们,也会显示它们的位置。

  2. 是的,它们应该都可以使用相同的名称访问,使用尖括号包括到达它们。当然,有些人可能会失踪的可能性很小。如果是这种情况,那么从一见钟情看,这种实施似乎是不可靠的。今天所有主要编制者都应该坚持这一点。

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

答案1:我在很短的时间内使用了Code :: Blocks,但是对于我在Dev-C ++和MSVC ++中记得的内容,标题位于IDE的目录中。 (例如,我的MSVC ++ include目录位于C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include中,并且它具有iostream文件。)

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

提示:你不是指“iostream”而不是“iostream.h”吗?