podejścia modułowe są ogólnie bardzo przydatne (przenośne i czyste), więc staram się programować moduły tak niezależnie, jak to możliwe. Większość moich podejść opiera się na strukturze opisującej sam moduł. Funkcja inicjalizacji ustawia podstawowe parametry, a następnie program obsługi (wskaźnik do struktury opisowej) jest przekazywany do dowolnej funkcji w module, która jest wywoływana.
W tej chwili zastanawiam się, jakie może być najlepsze podejście do alokacji pamięci dla struktury opisującej moduł. Jeśli to możliwe, chciałbym:
- Nieprzezroczysta struktura, więc strukturę można zmienić tylko przy użyciu dostarczonych funkcji interfejsu
- Wiele wystąpień
- pamięć przydzielona przez linker
Widzę następujące możliwości, że wszystkie są sprzeczne z jednym z moich celów:
globalna deklaracja
wiele instancji przypisanych przez linker, ale struct nie jest nieprzejrzysty
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
nieprzezroczysta struktura, wiele instancji, ale allocotion na stercie
w module.h:
typedef module_struct Module;
w module init moduł c, malloc i wskaźnik powrotu do przydzielonej pamięci
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
w main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
deklaracja w module
nieprzezroczysta struktura, przydzielana przez linker, tylko z góry określona liczba instancji
trzymaj całą strukturę i pamięć wewnętrznie w module i nigdy nie ujawniaj programu obsługi ani struktury.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Czy istnieje jakaś kombinacja tych opcji dla nieprzezroczystej struktury, linkera zamiast alokacji sterty i wielu / dowolnej liczby instancji?
rozwiązanie
jak zaproponowano w niektórych odpowiedziach poniżej, myślę, że najlepszym sposobem jest:
- zarezerwować miejsce na MODULE_MAX_INSTANCE_COUNT modułów w pliku źródłowym modułów
- nie definiuj MODULE_MAX_INSTANCE_COUNT w samym module
- dodaj #ifndef MODULE_MAX_INSTANCE_COUNT # błąd do pliku nagłówka modułów, aby upewnić się, że użytkownik modułów wie o tym ograniczeniu i określa maksymalną liczbę żądanych instancji dla aplikacji
- przy inicjalizacji instancji zwróć adres pamięci (* void) struktury opisowej lub indeks modułów (cokolwiek bardziej chcesz)