`
ld_hust
  • 浏览: 167182 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

头文件互包含于名字空间的相关问题

阅读更多

c/c++里面头文件的使用是相当频繁的,从头文件里面,基本上可以得到程序中绝大部分的信息.但是,在头文件中,却经常出现各种问题.首先便是重复定义的问题.在头文件里面定义,虽然可以使定义部分和实现部分分开,但是,当文件比较多的时候,一个头文件往往被重复包含了很多次,间接的造成了,很多内容被重复定义了好几次,从而产生编译器错误.简单的解决方法是头文件使用下面的格式:

#ifndef  __filename_h__
#define __filename_h__

//文件的内容

#endif

    这样的结构可以保证每个文件中的内容只被声明一次.似乎问题解决了,但是,这只解决了一个问题而已.还有一个问题,比较复杂,解决起来也是比较难的,就是文件的相互包含,而不光是重复包含.例如,有两个头文件,a.h,b.h其中,a.h中使用了b.h中定义的内容,即,在a.h中包含了b.h.同样,在b.h中也包含了a.h.这样就不是简单的重复声明的问题了,更大的问题是,当生命a.h时,需要b.h,而b.h在a.h完成之前是不能完成的,有点类似进程间的死锁问题。这种结构上的缺陷,不是简单的设计方法就能避免的,有的时候很自然的你就被引入到了这样的一个尴尬的境地。幸好,这种情况还是能够被解决的。如果是函数,只要简单的将函数的声明写到头文件开始就好了。(不推荐把函数的定义放到头文件中,所以这个不是问题)如果是结构体或类声明发生相互引用可以采用下面的模式:

在a.h中声明了
#include "b.h"
struct  a{
int length;
int weight;
struct b s_b;
};
    在b.h中声明:
struct a; // 仅仅表明 a 为一种 struct 。
struct b{
struct a * s_a; //只能使用指针
int another;
};

注意的是在b.h中,只能使用struct a * 类型,而不能直接产生a的变量。因为,在b.h中,并不知道a的内部是什么样子的,只有一个简单的声明表示它是某种结构体而已。

对于c++中的代码,如果包含名空间,需要重新打开名空间。
//a.h
#inlcude b.h
using namespace b;
namespace n_a{
class a{class b num;};
}
//b.h
namespace n_a{
class a;
};
using namespace n_a;
namespace n_b{
class b{ class n_a::a* p;};
}
同样的,只能使用指针来访问其中一种类型。

 

 

 

Visual C++ Concepts: Building a C/C++ Program
Compiler Error C2888

'identifier' : symbol cannot be defined within namespace 'namespace'

A symbol belonging to namespace A must be defined in a namespace that encloses A.

Example

// C2888.cpp
namespace M
{
   namespace N
   {
      void f1();
      void f2();
   }
   
   void N::f1() 
   {   //OK: namspace M encloses N
   }
}

namespace O
{
   void M::N::f2()
   {  // C2888: namespace O does not enclose M
   }
}
分享到:
评论

相关推荐

    C++的头文件互相包含的问题

    C++的头文件互相包含的问题。比较有用的解决办法。

    C语言头文件 DIR C语言头文件 DIR

    C语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言头文件 DIRC语言...

    C语言头文件 MEM C语言头文件 MEM

    C语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言头文件 MEMC语言...

    C语言头文件 NB30 C语言头文件 NB30

    C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言头文件 NB30C语言...

    C头文件避免重复包含问题

    C头文件的使用方法,避免头文件的重复包含

    C语言头文件 OLE C语言头文件 OLE

    C语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言头文件 OLEC语言...

    C语言头文件 temp C语言头文件 temp

    C语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言头文件 tempC语言...

    C语言头文件 UTIL C语言头文件 UTIL

    C语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言...

    C语言头文件 MATH C语言头文件 MATH

    C语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言头文件 MATHC语言...

    C语言头文件 DATA C语言头文件 DATA

    C语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言头文件 DATAC语言...

    C语言头文件 DOS C语言头文件 DOS

    C语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言头文件 DOSC语言...

    C语言头文件 GLU C语言头文件 GLU

    C语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言头文件 GLUC语言...

    C语言头文件 NEW C语言头文件 NEW

    C语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言头文件 NEWC语言...

    VC++头文件包含顺序

    介绍了VC++编程中各种头文件的包含顺序,避免因头文件包含顺序导致编译不通过的问题。

    头文件

    头文件头文件头文件

    C语言头文件 MAP C语言头文件 MAP

    C语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言头文件 MAPC语言...

    C语言头文件 RPC C语言头文件 RPC

    C语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言...

    C语言头文件包含关系分析工具

    c# 简易绘制C语言头文件包含关系图 详细说明可以查看我的blog http://www.cnblogs.com/geeking/ 本工具使用了DotNetBar中的TreeGX控件。下载地址: http://down2.cr173.com/soft1/DotNetBarSetup.zip

    C语言头文件 TSS C语言头文件 TSS

    C语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言头文件 TSSC语言...

    C语言头文件 XMEMORY

    C语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言头文件 XMEMORYC语言...

Global site tag (gtag.js) - Google Analytics