1

C++ のファイル インクルードに最適な場所は? 例えば:

/*Foo.h*/
#include <string>       //Should I place this between the #ifndef #endif?
#include "FooBar.h"
using namespace std;

#ifndef Foo_class
#define Foo_class
class Foo
{   
    /*XXX*/
}
#endif

/*FooBar.h*/
#ifndef FooBar_class
#define FooBar_class
class FooBar
{   
    /*XXX*/
}
#endif

/*Foo.cpp*/
#include "Foo.h"
/*XXX*/

/*FooBar.cpp*/
#include "FooBar.h"
/*XXX*/

必要なときにのみインクルードされるように、定義の間にインクルードを配置する必要がありますか? そうしないとシステムに影響はありますか?

4

5 に答える 5

3
#ifndef Foo_class
#define Foo_class

このペアは常に、.hファイルの最初の行のペアである必要があります。

インクルード ガードされた他の.hファイルまたはライブラリ ファイルをインクルードしている場合、それは問題ではないかもしれませんが、それでも良い習慣です。

もう 1 つの良い習慣はusing namespace std;、ヘッダーを避けることです。

于 2013-01-13T16:02:10.433 に答える
3

一般に、システム ヘッダー ファイルには誤った過剰インクルードに対する保護機能があるため、これは実際には問題になりません。

于 2013-01-13T16:02:36.800 に答える
2

ライブラリ ヘッダー ファイルには既に独自#ifdefの が含まれているため、複数のファイルに含まれている場合はすべて解決されます。なので、どこに置いても問題ありません。

于 2013-01-13T16:01:47.677 に答える
1

一番いいところは上です。

技術的な理由がある場合にのみ、他の人と異なることを行います。

この場合: - 他の回答が指摘しているように、2 つの間に技術的な違いはありません。- 私が遭遇したすべてのコードは、インクルード ガードを一番上に置きます。著作権表示の後にある場合もありますが、ガードは決して他のものではありません#includes

したがって、それを一番上に置きます。

于 2013-01-13T16:13:43.207 に答える
1

ほとんどの場合、内部のインクルード ファイルにインクルード ガードがある限り、実質的な違いはありません。あなたが最も理にかなっていると思う場所に置いてください!

ただし、#ifndef GUARDファイルのロードに時間がかかる場合 (たとえば、負荷の高いネットワーク ドライブや低速のディスクにある場合)、大規模なプロジェクトで同じヘッダー ファイルは、同じプロジェクトに何度も含まれる場合があります。

「common.h」があるとしましょう:

#include <iostream>
#include "lesser_common.h"
#include "not_so_common.h"

#ifndef COMMON_H
#define COMMON_H

... stuff goes here ...

#endif

main.c には、

#include <iostream>
#incldue "common.h"
#include "myheader1.h"
#include "myheader2.h"
#include "myheader3.h"

myheader{1,2,3}.h には common.h も含まれています。

理論的には、プリプロセッサは common.h のすべてを 4 回、iostream を 5 回読み取る必要があります。インクルード ガードを外して、common.h がインクルードされたときに他のファイルがインクルードされないようにすると、少なくとも iostream の 3 回の読み取りが保存されます。多数の他のファイルを含む膨大な数のファイルを含む大規模なプロジェクトの場合 [特に、「このファイルを使用する前に他のファイルを含める必要はない」という原則に同意する場合]、これは合計される可能性があります。かなりのファイル読み取りに。ファイルをどのように/どこに配置するかを主に選択するべきではありませんが、少しは心に留めておくことをお勧めします。

そうは言っても、ほとんどのプリプロセッサは「賢い」ものであり、最初にファイルの上部と下部にガードが含まれているかどうかを理解しており、次回はヘッダーを読み取る必要はありません。

また、実際に必要でない限り、ヘッダー ファイルにファイルを含めないことは非常に良い考えです。もちろん、ソース ファイルにも同じことが当てはまります。

于 2013-01-13T16:22:07.347 に答える