C++头文件如何进行重用

开发 后端
C++头文件的作用一般是存放不同的类的地方。在实际编程中,其作用是非常大的。希望大家可以通过本文介绍的内容充分掌握这一技巧。

C++编程语言从出现至今已经发展的越发成熟,逐渐成为了开发领域中一个重要的应用语言。今天大家可以从这篇文章中详细了解到有关C++头文件的一些嵌套方法,从而让大家更进一步的对这一语言有一个详细的了解。

在实际编程中,不同的类一般是放在不同的相互独立的C++头文件中的,这样两个类在相互引用时又会有不一样的问题。重复编译是问题出现的根本原因。为了保证头文 件仅被编译一次,在C++中常用的办法是使用条件编译命令。

  1. Example:  
  2. animal.h   
  3. class animal   
  4. {   
  5. ......  
  6. };   
  7. animal.cpp   
  8. #include "animal.h"   
  9. #include <iostream.h>   
  10. ......  
  11. fish.h   
  12. #include "animal.h"   
  13. class fish  
  14. {   
  15. ......   
  16. };   
  17. fish.cpp   
  18. #include "fish.h"   
  19. #include <iostream.h>   
  20. ......  
  21. main.cpp   
  22. #include "animal.h"   
  23. #include "fish.h"   
  24. void main()   
  25. {   
  26. ......  

编译文件,会出现class type redefinition的错误

为什么会出现类重复定义的错误呢?请读者仔细查看EX10.cpp文件,在这个文件中包含了animal.h和fish.h这两个头文件。当编译器编译EX10.cpp文件时,因为在文件中包含了animal.h头文件,编译器展开这个C++头文件,知道animal这个类定义了,接着展开fish.h 头文件,而在fish.h头文件中也包含了animal.h,再次展开animal.h,于是animal这个类就重复定义了。

要解决C++头文件重复包含的问题,可以使用条件预处理指令。修改后的头文件如下:

  1. animal.h   
  2. #ifndef ANIMAL_H_H   
  3. #define ANIMAL_H_H   
  4. class animal   
  5. {   
  6. ......  
  7. };   
  8. #endif   
  9. fish.h   
  10. #include "animal.h"   
  11. #ifndef FISH_H_H   
  12. #define FISH_H_H   
  13. class fish  
  14. {   
  15. ......   
  16. };   
  17. #endif 

我们再看EX10.cpp的编译过程。当编译器展开animal.h头文件时,条件预处理指令判断ANIMAL_H_H没有定义,于是就定 义它,然后继续执行,定义了animal这个类;接着展开fish.h头文件,而在fish.h头文件中也包含了animal.h,再次展开 animal.h,这个时候条件预处理指令发现ANIMAL_H_H已经定义,于是跳转到#endif,执行结束。

但是不要以为使用了这种机制就全部搞定了,比如在以下的代码中:

  1. //文件A.h中的代码  
  2. #pragma once  
  3. #include "B.h"  
  4. class A  
  5. {  
  6. public:  
  7. B* b;  
  8. };  
  9. //文件B.h中的代码  
  10. #pragma once  
  11. #include "A.h"  
  12. class B  
  13. {  
  14. public:  
  15. A* a;  
  16. }; 

这里两者都使用了指针成员,因此嵌套本身不会有什么问题,在主函数前面使用#include "A.h"之后,主要编译错误如下:

  1. error C2501: 'A' : missing storage-class or type specifiers 

仍然是类型不能找到的错误。其实这里仍然需要前置声明。分别添加前置声明之后,可以成功编译了。代码形式如下:

  1. //文件A.h中的代码  
  2. #pragma once  
  3. #include "B.h"  
  4. class B;  
  5. class A  
  6. {  
  7. public:  
  8. B* b;  
  9. };  
  10. //文件B.h中的代码  
  11. #pragma once  
  12. #include "A.h"  
  13. class A;  
  14. class B  
  15. {  
  16. public:  
  17. A* a;  
  18. }; 

这样至少可以说明,C++头文件包含代替不了前置声明。有的时候只能依靠前置声明来解决问题。我们还要思考一下,有了前置声明的时候头文件包含还是必要的 吗?我们尝试去掉A.h和B.h中的#include行,发现没有出现新的错误。那么究竟什么时候需要前置声明,什么时候需要头文件包含呢?

【编辑推荐】

  1. C++字符串各种用法讲解
  2. C++异常概念详解
  3. C++获取文件大小常用技巧分享
  4. C++全局函数应用指南
  5. C++引用基本概念详解
责任编辑:曹凯 来源: 博客园
相关推荐

2010-01-27 15:29:45

C++异常处理

2010-01-20 13:29:40

C++环境

2010-01-20 10:49:29

Visual C++界

2010-01-20 09:32:30

C++类

2010-01-22 16:21:50

C++ Builder

2010-01-12 09:59:08

Visual C++

2010-01-15 19:05:42

学习C++

2014-09-19 10:46:36

LuaCC++

2010-01-25 17:55:38

C++头文件

2010-01-19 14:39:22

C++ Builder

2010-02-05 17:16:05

C++构造函数

2010-01-27 10:45:21

C++单例模式

2010-02-06 14:48:37

C++头文件

2010-01-25 18:26:44

CC++头文件

2009-08-27 15:33:58

C# Cookie编程

2010-01-28 10:33:10

C++开发程序

2011-07-14 22:36:37

C++

2010-01-15 17:31:18

C++Test

2011-09-01 18:54:29

WifiGoodReader

2010-01-15 18:06:20

C++引用
点赞
收藏

51CTO技术栈公众号