温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++中怎么重用头文件

发布时间:2021-07-19 16:15:38 来源:亿速云 阅读:173 作者:Leah 栏目:编程语言

这篇文章给大家介绍C++中怎么重用头文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

Example:  animal.h   class animal   {   ......  };   animal.cpp   #include "animal.h"   #include <iostream.h>   ......  fish.h   #include "animal.h"   class fish  {   ......   };   fish.cpp   #include "fish.h"   #include <iostream.h>   ......  main.cpp   #include "animal.h"   #include "fish.h"   void main()   {   ......  }

编译文件,会出现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++头文件重复包含的问题,可以使用条件预处理指令。修改后的头文件如下:

animal.h   #ifndef ANIMAL_H_H   #define ANIMAL_H_H   class animal   {   ......  };   #endif   fish.h   #include "animal.h"   #ifndef FISH_H_H   #define FISH_H_H   class fish  {   ......   };   #endif

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

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

//文件A.h中的代码  #pragma once  #include "B.h"  class A  {  public:  B* b;  };  //文件B.h中的代码  #pragma once  #include "A.h"  class B  {  public:  A* a;  };

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

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

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

//文件A.h中的代码  #pragma once  #include "B.h"  class B;  class A  {  public:  B* b;  };  //文件B.h中的代码  #pragma once  #include "A.h"  class A;  class B  {  public:  A* a;  };

关于C++中怎么重用头文件就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI