2009-11-17 78 views
0

可以.h文件看到什么在对方没有被列入?我知道我什么时候用C语言编写程序之前,我可以在没有#include“myfile.h”的情况下从其他.h文件的.h文件中使用变量。我试图在C++中做同样的事情,并且我一直得到“定义超出范围错误”C++头文件简单问题

+0

你可以重新声明所需的变量作为'extern'来防止这个错误,但我不认为这就是你想要的 – Earlz

+1

阅读:http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko

回答

2

不是直接。但是,如果.cc.c文件#include是一个文件,那么它之后的任何头文件将会看到该头文件的内容。原因是#include的行为就像复制粘贴:每个文件内容都被有效地转储到一个大文件中,编译器只能看到合并后的结果。例如,如果您有:

foo.cc:

#include <a.h> 
#include <b.h> 
#include <c.h> 

// foo.cc's contents 

即使b.h#include a.h,其定义将仍然处于BH可见,因为编译器看到的所有内容头像好像他们是foo.cc的一部分。这在实践中可能相当成问题,因为程序依赖于它们没有明确包含的定义。当某人更改a.h时,您可以开始在b.h(或之后的任何标题#included)处看到错误。

但我不认为这会完全回答你的问题,因为这个过程本身不应该导致任何“定义超出范围”的错误。注意发布有问题的代码示例?

+0

有点? '#include' *正好*复制粘贴,直到包含文件的最后一行是否有终止换行符。 – 2009-11-17 00:23:55

+0

@R。 Pate:是的,但它也会像添加#line指令一样,让编译器知道文件和它应该在的行。但我同意强调复制和粘贴部分很重要。我会编辑。 – quark

+1

@ R.Pate:有趣的你应该使用这个例子。在C++中,如果任何非空源文件没有终止换行符(2.1/1/2),则程序的行为是不确定的。 “源文件”的定义包含通常称为“头文件”的内容。所以这就是它不一定等同于复制和粘贴的一个方面。不过,我想所有或几乎所有的预处理器都是这样实现的。如果换行符丢失,GCC会发出警告。 –

0

变量在.h文件是一个岌岌可危的境地,因为当你#include一个头文件,它只是粘贴到您的源文件。因此,如果您的头文件中包含int j;并将其包含在其他源文件中,那么您基本上只定义了几个不同的变量,称为j,当然这是一个错误。

0

不,在C或C++中都没有。通常情况下,标题是间接包含的,这可能是您以前的经历中可能发生的情况。

0

在C和C++中,除非将其加载到编译单元(通常为.c或.cpp文件)中,否则不会显示任何内容,或者如果显式声明该内容。

,您可以转发声明一个变量与“外部”

extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here 

旧的C编译器可能已经对需要向前声明更为宽松。