2

C++ には、次のようないくつかのヘッダー ファイルBase.hと、次を使用するいくつかのクラスがありますBase.h

//OtherBase1.h
#include "Base.h"
class OtherBase1{
    // something goes here
};

//OtherBase2.h
#include "Base.h"
class OtherBase2{
    // something goes here
};

では、ヘッダーが重複しているため、これら 2 つのクラスmain.cppのうちの 1 つしか使用できません。OtherBase両方のクラスを使用したい場合はOtherBase2.h#include "OtherBase1.h"の代わりに使用する必要があり#include "Base.h"ます。ときどき を使いたいだけなOtherBase2.hので、 に含めるのOtherBase1.hは本当に変だと思います。この状況を回避するにはどうすればよいですか? また、ヘッダー ファイルを含めるためのベスト プラクティスは何ですか?OtherBase1.hOtherBase2.h

4

3 に答える 3

8

You should be using include guards in Base.h.

An example:

// Base.h
#ifndef BASE_H
#define BASE_H

// Base.h contents...

#endif // BASE_H

This will prevent multiple-inclusion of Base.h, and you can use both OtherBase headers. The OtherBase headers could also use include guards.

The constants themselves can also be useful for the conditional compilation of code based on the availability of the API defined in a certain header.

Alternative: #pragma once

Note that #pragma once can be used to accomplish the same thing, without some of the problems associated with user-created #define constants, e.g. name-collisions, and the minor annoyances of occasionally typing #ifdef instead of #ifndef, or neglecting to close the condition.

#pragma once is usually available but include guards are always available. In fact you'll often see code of the form:

// Base.h
#pragma once

#ifndef BASE_H
#define BASE_H

// Base.h contents...

#endif // BASE_H
于 2012-06-12T04:24:36.530 に答える
4

重複を避けるために、ヘッダー ガードを使用する必要があります。

http://en.wikipedia.org/wiki/Include_guard

たとえば、Base.h次のように追加します。

#ifndef BASE_H_
#define BASE_H_

// stuff in Base.h

#endif

聞いたガード形式については、この SO の質問を参照してください

#include ヘッダー ガード形式?

于 2012-06-12T04:31:09.917 に答える
0

同じヘッダー ファイルを複数回インポートすることに関連する問題を回避するために、プリプロセッサを使用してそれを防ぐことができます。これを行う通常の方法は、これらのビットを に追加することBase.hです。

#ifndef BASE_H_CONSTANT
#define BASE_H_CONSTANT

// Stick the actual contents of Base.h here

#endif
于 2012-06-12T04:25:23.333 に答える