0

重複の可能性:
Cヘッダーファイルのループ

元の質問:

次のエラーが発生する理由を理解するのにいつも問題がありました。

何か.h

#ifndef SOMETHING_H
#define SOMETHING_H

#include "somethingelse.h"

#endif

somethingelse.h

#ifndef SOMETHINGELSE_H
#define SOMETHINGELSE_H

#include "something.h"

#endif

なぜこれでエラーが発生するのですか?

1)SOMETHING_Hが定義されていません

2)SOMETHING_Hが定義され、somethingelse.hが含まれる

3)SOMETHINGELSE_Hが定義されておらず、定義され、something.hが含まれる

4)SOMETHING_Hが定義されています。#endifにジャンプします。これで終わりですか?


編集:

エラーはまったく発生しません。ただし、以下は行います。

何か.h

#pragma once

#include "somethingelse.h"

class something {
    int y;
    somethingelse b;
};

somethingelse.h

#pragma once

#include "something.h"

class somethingelse {
    something b;
    int x;
};

そして、それは論理的です。なぜなら、「somethingelse」がそのクラスのインスタンスを必要とするとき、クラス「something」はまだ定義されていないからです。

この問題は、前方定義によって解決されます。

何か.h

#pragma once

class somethingelse;

class something {
    int y;
    somethingelse* pB; //note the pointer. Correct me if I'm wrong but I think it cannot be an object because the class is only declared, not defined.
};

.cppに、「somethingelse.h」を含めて、クラスのインスタンスを作成できます。

4

2 に答える 2

1

エラーがまったくないことを除いて、あなたの説明は正確に正しいです。pragma message("Some text")フローをトレースするために、さまざまな場所に(Visual Studioを想定して)追加します。

他の投稿者がすでに指摘しているように、ヘッダーファイルには、相互に定義を必要とするクラスが含まれている可能性が高く、それが問題の原因です。この種の問題は通常、

  • 可能な場合は前方参照を使用する
  • #include可能な場合はsをCPPファイルに移動する
于 2011-10-30T18:50:59.503 に答える
0

それがまさに起こることです。

これは「インクルードガード」と呼ばれ、無限に再帰的なインクルードを回避するために使用されます。

于 2011-10-30T18:42:16.147 に答える