可以.h文件看到什么在对方没有被列入?我知道我什么时候用C语言编写程序之前,我可以在没有#include“myfile.h”的情况下从其他.h文件的.h文件中使用变量。我试图在C++中做同样的事情,并且我一直得到“定义超出范围错误”C++头文件简单问题
回答
不是直接。但是,如果.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
(或之后的任何标题#include
d)处看到错误。
但我不认为这会完全回答你的问题,因为这个过程本身不应该导致任何“定义超出范围”的错误。注意发布有问题的代码示例?
有点? '#include' *正好*复制粘贴,直到包含文件的最后一行是否有终止换行符。 – 2009-11-17 00:23:55
@R。 Pate:是的,但它也会像添加#line指令一样,让编译器知道文件和它应该在的行。但我同意强调复制和粘贴部分很重要。我会编辑。 – quark
@ R.Pate:有趣的你应该使用这个例子。在C++中,如果任何非空源文件没有终止换行符(2.1/1/2),则程序的行为是不确定的。 “源文件”的定义包含通常称为“头文件”的内容。所以这就是它不一定等同于复制和粘贴的一个方面。不过,我想所有或几乎所有的预处理器都是这样实现的。如果换行符丢失,GCC会发出警告。 –
变量在.h文件是一个岌岌可危的境地,因为当你#include
一个头文件,它只是粘贴到您的源文件。因此,如果您的头文件中包含int j;
并将其包含在其他源文件中,那么您基本上只定义了几个不同的变量,称为j
,当然这是一个错误。
不,在C或C++中都没有。通常情况下,标题是间接包含的,这可能是您以前的经历中可能发生的情况。
在C和C++中,除非将其加载到编译单元(通常为.c或.cpp文件)中,否则不会显示任何内容,或者如果显式声明该内容。
,您可以转发声明一个变量与“外部”
extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here
旧的C编译器可能已经对需要向前声明更为宽松。
- 1. makefile或头文件的简单问题?
- 2. 有关C++头文件的简单问题
- 3. 简单的C++文件开口问题
- 4. 简单的文件问题(C)
- 5. C++头文件问题
- 6. 简单C问题
- 7. 做一个简单的C头文件
- 8. C++头文件编译器问题(Sales_item.h)C++头文件示例
- 9. 一个简单的粘头文件jQuery脚本的问题
- 10. 简单的ASP.NET/C#问题 - 事件
- 11. 简单的C#事件参数问题
- 12. C#NHibernate简单问题
- 13. C++简单线程问题
- 14. C#简单IF或问题
- 15. 简单的C问题
- 16. C++链表简单问题
- 17. 头文件问题
- 18. Eclipse的C + +头和文件问题
- 19. C++头文件变量范围问题
- 20. C++头文件保护问题
- 21. C++包含头文件问题
- 22. C递归头文件包含问题?
- 23. C++头文件 - 语法问题
- 24. 基本的C++头文件问题
- 25. C++头文件和类定义问题
- 26. 简单的批处理文件问题
- 27. Python:简单文件格式化问题
- 28. 简单的Android文件输出问题
- 29. 简单的web.config文件的问题asp.net
- 30. 简单的HTML文件共享问题?
你可以重新声明所需的变量作为'extern'来防止这个错误,但我不认为这就是你想要的 – Earlz
阅读:http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko