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

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

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

本篇关键词:问题定义重复文件
黑客防线网安网讯:    };  //文件B.h中的代码  #pragma once  #include "A.h"  class B  {  public:  A* a;  };   这里两者都使用了指针成员,因此嵌套本身不会有什么问题,在主函数前面使...
    };
  //文件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;
  };
  这样至少可以说明,头文件包含代替不了前置声明。有的时候只能依靠前置声明来解决问题。我们还要思考一下,有了前置声明的时候头文件包含还是必要的 吗?我们尝试去掉A.h和B.h中的#include行,发现没有出现新的错误。那么究竟什么时候需要前置声明,什么时候需要头文件包含呢?
  三、两点原则
  头文件包含其实是一件很烦琐的工作,不但我们看着累,编译器编译的时候也很累,再加上头文件中常常出现的宏定义。感觉各种宏定义的展开是非常耗时间的,远不如自定义函数来得速度。我仅就不同头文件、源文件间的句则结构问题提出两点原则,仅供参考:
  第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。
  第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分 (H文件)。
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15256-1.html
网站维护教程更新时间:2012-04-04 22:52:12  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer