モジュラーアプローチは一般的に非常に便利(ポータブルでクリーン)であるため、可能な限り他のモジュールから独立したモジュールをプログラムするようにします。私のアプローチのほとんどは、モジュール自体を記述する構造体に基づいています。初期化関数は主なパラメーターを設定し、その後、ハンドラー(desriptive構造体へのポインター)がモジュール内の任意の関数に渡されます。
今、私はモジュールを記述する構造体のためのメモリの割り当ての最良のアプローチが何であるか疑問に思っています。可能であれば、私は次のものが欲しいです:
- 不透明な構造体。したがって、構造体は、提供されたインターフェイス関数を使用することによってのみ変更できます。
- 複数のインスタンス
- リンカによって割り当てられたメモリ
次の可能性があり、それはすべて私の目標の1つと矛盾しています。
グローバル宣言
複数のインスタンス、リンカーによって割り当てられますが、構造体は不透明ではありません
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
不透明な構造体、複数のインスタンス、ただしヒープ上の割り当て
module.h内:
typedef module_struct Module;
module.c init関数、mallocおよび割り当てられたメモリへの戻りポインタ
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
main.c内
(#includes)
Module *module;
void main(){
module = module_init();
}
モジュール内の宣言
リンカによって割り当てられた不透明な構造体、事前定義された数のインスタンスのみ
構造体とメモリ全体をモジュールの内部に保持し、ハンドラーまたは構造体を公開しないでください。
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
ヒープの割り当てと複数/任意の数のインスタンスの代わりに、不透明な構造体、リンカーのためにこれらを何らかの形で組み合わせるオプションはありますか?
解決
以下のいくつかの回答で提案されているように、最善の方法は次のとおりだと思います:
- モジュールソースファイル内のMODULE_MAX_INSTANCE_COUNTモジュール用のスペースを予約
- モジュール自体にMODULE_MAX_INSTANCE_COUNTを定義しないでください
- モジュールヘッダーファイルに#ifndef MODULE_MAX_INSTANCE_COUNT #errorを追加して、モジュールユーザーがこの制限を認識し、アプリケーションに必要なインスタンスの最大数を定義するようにします
- インスタンスの初期化時に、記述的構造体のメモリアドレス(* void)またはモジュールインデックス(好きなもの)を返します。