我是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”。尽管如此,当我包含它时,我的代码会编译并运行。
所以我的问题:
当我的硬盘驱动器甚至没有它时,G ++如何找到iostream标头?
所有标准C ++标头(如此处列出:http://msdn.microsoft.com/en-us/library/ct1as7hw.aspx)是否可供所有C ++编译器使用?具有相同的名称,所以我不必更改我的源代码?
答案 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)
使用引号将搜索当前目录,然后转到使用尖括号搜索的目录。除了\include
中列出的文件之外,还有其他目录。那就是你可以找到没有任何扩展的那些。你可能有一个c++
文件夹,里面有这些文件,但即使使用Windows 7搜索从CodeBlocks目录中搜索它们,也会显示它们的位置。
是的,它们应该都可以使用相同的名称访问,使用尖括号包括到达它们。当然,有些人可能会失踪的可能性很小。如果是这种情况,那么从一见钟情看,这种实施似乎是不可靠的。今天所有主要编制者都应该坚持这一点。
要在您的类中使用您自己的标头,它们应与主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”吗?