c++中头文件重复定义问题_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

c++中头文件重复定义问题

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:问题定义重复文件
黑客防线网安网讯:   一、同一头文件中类嵌套的疑问  假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,像下面的写法是错误的:  class B;  class A  { ...
   一、同一头文件中类嵌套的疑问
  假设我们有两个类A和B分别定义在各自的头文件A.h和B.h中但是在A中要用到B,B中也要用到A,像下面的写法是错误的:
  class B;
  class A
  {
  public:
  B b;
  };
  class B
  {
  public:
  A a;
  };
  因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的在这里我们只需要把其中的一个A类中的B类型成员改成指针形式 就可以避免这个无限延伸的怪圈了为什么要更改A而不是B?因为就算你在B中做了类似的动作,也仍然会编译错误,表面上这仅仅上一个先后顺序的问题。
  为什么会这样呢?因为C++编译器自上而下编译源文件的时候,对每一个数据的定义,总是需要知道定义的数据的类型的大小。在预先声明语句class B;之后,编译器已经知道B是一个类,但是其中的数据却是未知的,因此B类型的大小也不知道。这样就造成了编译失败,VC++6.0下会得到如下编译错 误:
  error C2079: 'b' uses undefined class 'B'
  将A中的b更改为B指针类型之后,由于在特定的平台上,指针所占的空间是一定的(在Win32平台上是4字节),这样可以通过编译。
  二、不同头文件中的类的嵌套在实际编程中,不同的类一般是放在不同的相互独立的头文件中的,这样两个类在相互引用时又会有不一样的问题。重复编译是问题出现的根本原因。为了保证头文 件仅被编译一次,在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头文件,编译器展开这个头文件,知道animal这个类定义了,接着展开fish.h 头文件,而在fish.h头文件中也包含了animal.h,再次展开animal.h,于是animal这个类就重复定义了。
  要解决头文件重复包含的问题,可以使用条件预处理指令。
  修改后的头文件如下:
  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;
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15255-1.html
网站维护教程更新时间:2012-04-04 22:52:12  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer