2009-05-16 9 views
1

私は実際のフレーズが何であるか分からないので、「ダブルリンク」という言葉を使いますが、head1.hとhead2.hの2つのヘッダを持っていると仮定しています。 head1.hでヘッダーファイルを「二重リンク」するのに便利で必要な状況はありますか? (C++)

:head2.hで

#include"head2.h" 
//do stuff 

#include"head1.h" 
//do stuff 

私はそれは本当に無限ループではないとして、互いに反対側に配置された二つのミラーとしてそれを視覚化し、他のいくつかの有限のコンピュータに無限を持たせるという形です(しかし私は逃げ出します)。要点は、このコンセプトを使用することが有用か必要か、あるいはコンセプトのバリエーションですか? (つまり:私はgotoが即効ブレークとして使用できると思います)。

答えて

3

これは「サイクリックインクルード」であり、これは望ましいことではありません。あなたのgotoは役に立たないでしょう。なぜなら、gotosはプログラムの実行の一部であり、#includeはコンパイルの前処理段階で解釈されるからです。

いつもの事はあなたのヘッダファイルはそう、彼らは二度同じものを定義しようとしません

#ifndef FOO_H 
#define FOO_H 
... rest of the include file here 
#endif 

ような構造を持たせることです。

あなたはここで何が起こるかだ、それを試してみてください:bh.hからインクルードファイル

のbashの$のgcc crecursive.c:1、

  from ah.h:1, 
      from bh.h:1, 
      from ah.h:1, 

を...多くの行が省略されています

  from ah.h:1, 
      from crecursive.c:2: ah.h:1:16: error: #include nested too deeply  

はbash $

7

通常、ヘッダは無限再帰を引き起こしてから正確にこの種のものを防止するためのプリプロセッサ文を持っています。でも、その保護と

#ifndef MY_FILE_H 
#define MY_FILE_H 

//do stuff 

#endif 

は、相互が含ま

は、通常は悪い考えです。

+0

OTOHでは、マイナーバリエーションが一般的です - head1.hにはhead3.h(head3.hのサービスが必要なため)が含まれています。また、head2.hもhead1.hとhead2.hの両方のコードが含まれていますhead3.hを2度含むことから保護される。示されたヘッダーガードは、それがトラブルを引き起こすのを防ぎます。 –

1

これを避けるための通常の方法は、空のクラス宣言です。

//head1.h 

class Foo; 

class Bar { 
public: 
    Bar(Foo* f) : foo(f) {} 
private: 
    Foo* foo; 
}; 

// head2.h 

class Bar; 

class Foo { 
public: 
    void func(Bar* bar); 
}; 

ヘッダファイルが互いに宣言する必要がある多くのクラスを作成する場合、通常は次のようなインクルードファイルで終わります。

//fwd.h 

class Bar; 
class Foo; 

// head1.h 

#include "fwd.h" 

class Foo { .... 

// head2.h 

#include "fwd.h" 

class Bar { .... 
+0

"空クラス"の宣言は、実際には前方宣言と呼ばれます。FYI – njsf

0

それは本当に ないように2つのmirrosあなたは間違って視覚化する無限ループ、互いに

を opposieを置くように私はそれを視覚化します。;) #includeはコピー/ペースト以外の何ものではなく、プログラムがコンパイルされる前に発生します。だからあなたが設定したのは、コンパイル中の無限ループです。コンパイラは、#include "head2.h"で始まるhead1.hを読み取ります。だから、head2.hを挿入して解析を続けますが、#include "head1.h"で始まるので、それをインクルードする必要があります。

通常、コンパイラが無限ループに陥るのを防ぐためにガードが含まれています。

重要なことは、プログラムがコンパイルされる前に、そして確かに実行される前に、プレーンテキスト処理のように行われるということです。無限回数コピー/ペーストしない限り、建設的なものには使用できませんあなたの楽しい時間のアイデアです。

関連する問題