7

複数の開発者が使用するヘッダーファイルを作成する場合、そのヘッダーファイルで使用されるすべての定義と宣言に関して、そのヘッダーファイルを自給自足にすることは優れたプログラミング手法と見なされます。

例えば:

ヘッダーファイル1:types.h

#ifndef TYPES_H
#define TYPES_H
typedef unsigned int uint16
#endif

ヘッダーファイル2:myheader.h

#ifndef MYHEADER_H
#define MYHEADER_H
uint16 myfunc(void);
#endif

私はtypes.hを含めずにmyheader.hでuint16を使用しました。したがって、ソースファイルにmyheader.hを含めたい場合は、最初に「types.h」を含めてから、「myheader.h」を含める必要があります。したがって、これは実際には開発者に特定の順序でヘッダーファイルを含めることを強制しています。私はいつもこれを悪い習慣だと思っていましたが、今日私の会社で、1つのファイルで関数を宣言するには、少なくとも4つの他のヘッダーファイルをインクルードする必要があるコードに出くわしました。だから今、私は混乱しています、何かが足りないのですか、これが期待される行動と見なされる場所はありますか?

4

6 に答える 6

5

不要な型でグローバル名前空間を汚染することは悪い習慣です。あなたができる最善のことは、可能な場合は前方宣言を提供しinclude、必要な場合は他のファイルを提供することです。uint16単純化したケースでは、それを使用するすべてのヘッダーに定義するヘッダーを含める必要があります。

たとえば、型を前方宣言できる場合は、これが優先されます。理論的根拠は、実際に型を使用しない場合は前方宣言で十分であるということです。また、型を使用する場合、明示的に宣言されている場所にヘッダーを含める必要があります。

于 2012-08-07T18:06:55.853 に答える
4

インクルード ガードをいくつか作成してから、#include "types.h"myheader.h に追加することをお勧めします。他の人に考えさせないでください (少なくともこのようにしないでください)。

于 2012-08-07T18:06:47.773 に答える
3

あなたの質問に具体的に答えるために:はい、ヘッダーファイルは自給自足でなければなりません。コンパイルできるようにするために必要なすべてのヘッダー ファイルをインクルードする必要があります。

一般に、ほとんどの最新のライブラリにはガードが配置されているため、ヘッダー ファイルはコンパイラによって一度だけ「認識」されます。先着順です。ですから、それにこだわりすぎないでください (ただし、確認するのに苦労することはありません)。

于 2012-08-07T18:11:28.487 に答える
1

パブリック ヘッダーは、公開するインターフェイスを使用するために必要なすべての定義を提供する必要があります。

于 2012-08-07T18:31:58.937 に答える
0

これはおそらく慣例の問題ですが、ほぼすべての同様のケースで、最初にmyheader.h#includesが含まtypes.hれています。

于 2012-08-07T18:08:21.750 に答える