より大きなプロジェクトに取り組むことに関しては、私はいくつかの独自のタイプ(例えばmyType)を投入したいと思います。「急いで」アプローチは、それらのtypedefをヘッダー(たとえばmyType.h)に入れ、それらの型で動作する一連の関数と一緒にすることです。
新しいタイプをどこかで使用する場合はmyType.h、ソースファイルに含めます。罰金。
しかし、関数シグニチャの引数として新しい型をどこかで使用したい場合は、関数myType.hを含むモジュールのヘッダーにを含める必要があります。いずれかのtypedefを使用すると、これは問題ないように見えますが、タイプが多いほど、必要なヘッダーに含まれるものが多くなり、他の独自のタイプを含むtypeを使用しながら、さらにヘッダーを含めることができます。これは私が「依存関係地獄」と呼ぶものをもたらしています。
このジレンマを解決するための賢く、スタイリッシュで、ベストプラクティスの方法はありますか?
これらの型をvoidポインターとして渡し、関数内にキャストして戻す可能性があることは認識していますが、コンパイラーからの重要な型チェックを失います。
総統は、externこのあたりで最悪の慣行と見なされています。
編集:
詳細に:
myType.h:
#include "otherType.h"
typedef struct {
char Name[32];
int Size;
otherType someType;
} myType;
processSomeHow(myType _myType, int NewSize);
otherType.h
#define SOME_CONST 32
typedef struct { [...] } otherType;
someModule.h:
#include "myType.h"
int specialProcessSomeHow(myType _myType);
someModule.c:
int specialProcessSomeHow(myType _myType)
{
int Size = 64;
return(processSomeHow(_myType, Size));
}
今、私はotherType.h間接的にsomeModule.h、さらに悪いことに、を含むすべてのモジュールにそれを含めますsomeModule.h。今、私はSOME_CONSTどこにでもいるので、どこから来たのかを理解するのは難しいです。インクルードツリーを2つ維持する必要があります。