0

私が持っていると仮定するとa.h、次のものが含まれます。

<stdbool.h>
<stddef.h>
<stdin.h>

私も持っていると仮定b.hします<stdbool.h>。プリプロセッサ定義ステートメントが含まれている場合とa.h含まれていない場合。含まれていないものだけが含まれますか?では、インクルードの場合、インクルードとインクルードは再インクルードされますか、それともこれらのプリプロセッサ定義関数は、このクラス全体が再定義されているかどうかを確認するためにのみ使用され、クラス内の特定の関数は使用されませんか?#ifndefb.ha.hb.hb.ha.ha.hstddef.hstein.hstdbool.h

編集:

b.hまた、-を含む別のヘッダーファイルが含まれていると仮定します。これstdbool.hにより、そのクラスとの両方が含まれます。それはエラーを引き起こしますか?b.hstdbool.ha.h

4

3 に答える 3

1

stdbool.hそれ自体にガードが含まれている場合( #ifndef)、すべてが正常になります。そうしないと、実際にいくつかのヘッダーが2回含まれることになります。問題が発生しますか?場合によります。2回インクルードされたヘッダーに宣言のみが含まれている場合、すべてがコンパイルされます。数ナノ秒長くかかります。これを想像してみてください:

int the_answer(void); // <-- from first inclusion
int the_answer(void); // <-- from from second inclusion - this is OK
                      //       at least as long as declarations are the same

int main()
{
    return the_answer();
}

一方、定義がある場合は、エラーが発生します。

int the_answer(void)  // <-- from first inclusion - OK so far
{
    return 42;
}

int the_answer(void)  // <-- from second inclusion
{                     //     error: redefinition of 'the_answer'
    return 42;
}

int main()
{
    return the_answer();
}
于 2012-03-13T19:13:47.167 に答える
1

すべてのC標準ヘッダーは、複数回、任意の順序で含めることができるように作成する必要があります。

標準ヘッダーは任意の順序で含めることができます。それぞれが特定のスコープに複数回含まれる場合があり、1回だけ含まれる場合と違いはありません。

于 2012-03-13T19:16:52.540 に答える
0

ほとんどのヘッダーがで始まるのは正常です

#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_

そして次の行で終わります:

#endif

#ifndefヘッダーを2回含めると、2回目は、#defineとが原因で、プログラムに完全なヘッダーが再び含まれなくなります。#endif

于 2012-03-13T19:52:25.413 に答える