ヘッダファイルが名前空間に含まれる問題


c/c++のヘッダファイルの使用はかなり頻繁で、ヘッダファイルの中から、基本的にプログラムのほとんどの情報を得ることができます.しかし、ヘッダファイルでは、様々な問題がしばしば発生する.まず定義を繰り返す問題である.ヘッダファイルの定義は、定義部分と実装部分を分けることができるが、ファイルが比較的多い場合、ヘッダファイルが複数回含まれることが多く、間接的に多くの内容が複数回定義され、コンパイラエラーが発生する.簡単な解決策は、ヘッダファイルに次のフォーマットを使用することです.
#ifndef  __filename_h__#define __filename_h__
//ファイルの内容
#endif
このような構成は、各ファイルの内容が一度だけ宣言ことを保証することができる.問題は解決したようだが、これは一つの問題にすぎない.もう一つの問題は、複雑で、解決も難しい.ファイルの相互含有であり、重複含有だけではない.例えば、2つのヘッダファイル、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.husing namespace b;namespace n_a{class a{class b num;};}//b.hnamespace 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
Copy
// 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
   }
}