Modulare Ansätze sind im Allgemeinen ziemlich praktisch (portabel und sauber), daher versuche ich, Module so unabhängig wie möglich von anderen Modulen zu programmieren. Die meisten meiner Ansätze basieren auf einer Struktur, die das Modul selbst beschreibt. Eine Initialisierungsfunktion legt die primären Parameter fest. Anschließend wird ein Handler (Zeiger auf die beschreibende Struktur) an die aufgerufene Funktion innerhalb des Moduls übergeben.
Im Moment frage ich mich, was der beste Ansatz für die Zuweisung von Speicher für die Struktur sein kann, die ein Modul beschreibt. Wenn möglich, würde ich mir Folgendes wünschen:
- Undurchsichtige Struktur, daher kann die Struktur nur durch die Verwendung der bereitgestellten Schnittstellenfunktionen geändert werden
- Mehrere Instanzen
- Vom Linker zugewiesener Speicher
Ich sehe folgende Möglichkeiten, die alle mit einem meiner Ziele in Konflikt stehen:
globale Erklärung
mehrere Instanzen, die vom Linker zugeordnet werden, aber struct ist nicht undurchsichtig
(#includes)
module_struct module;
void main(){
module_init(&module);
}
Malloc
undurchsichtige Struktur, mehrere Instanzen, aber Zuteilung auf Haufen
in module.h:
typedef module_struct Module;
in der Init-Funktion von module.c malloc und Rückgabezeiger auf den zugewiesenen Speicher
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
in main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
Erklärung im Modul
opake Struktur, vom Linker zugewiesen, nur eine vordefinierte Anzahl von Instanzen
Behalten Sie die gesamte Struktur und den gesamten Speicher innerhalb des Moduls und machen Sie niemals einen Handler oder eine Struktur verfügbar.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Gibt es eine Möglichkeit, diese für eine undurchsichtige Struktur, einen Linker anstelle einer Heap-Zuordnung und mehrere / beliebig viele Instanzen zu kombinieren?
Lösung
Wie in den folgenden Antworten vorgeschlagen, ist meiner Meinung nach der beste Weg:
- Reservieren Sie Speicherplatz für MODULE_MAX_INSTANCE_COUNT Module in der Modulquelldatei
- Definieren Sie MODULE_MAX_INSTANCE_COUNT nicht im Modul selbst
- Fügen Sie der Modulheaderdatei den Fehler #ifndef MODULE_MAX_INSTANCE_COUNT # hinzu, um sicherzustellen, dass der Modulbenutzer diese Einschränkung kennt und die maximale Anzahl der für die Anwendung gewünschten Instanzen definiert
- Bei der Initialisierung einer Instanz wird entweder die Speicheradresse (* void) der beschreibenden Struktur oder der Modulindex (was auch immer Sie mehr wollen) zurückgegeben.