Mam wiele plików nagłówkowych, każdy z nich musi dodać numer do tablicy, aby zarejestrować jego funkcje.C dołączyć do tablicy w pliku nagłówkowym
Obecnie mam funkcję o unikalnej nazwie w każdym pliku nagłówkowym, aw pliku programu muszę wywoływać wszystkie te funkcje w jednej funkcji łączącej.
int register1() { return 100; }; //in header1.h
int register2() { return 200; }; //in header2.h
int register3() { return 300; }; //in header3.h
int register4() { return 400; }; //in header4.h
int registered[] = {register1(),register2(),register3(),register4()}; //main.c
Jest to dość niewygodne, ponieważ muszę zmodyfikować w dwóch miejscach, gdy dodaję lub usuwam pliki nagłówkowe. Lepiej byłoby zmodyfikować tylko plik nagłówkowy. Myślałam o preprocesor zdefiniować, tak w każdym nagłówku można po prostu użyć czegoś takiego:
#define Registered Registered,100 // header1.h
#define Registered Registered,200 // header2.h
int registered[] = {Registered}; // main.c
Ale to oczywiście nie będzie kompilować, ponieważ nowe zdefiniowanie nowo starą. Czy istnieje sposób dołączenia definicji? Lub w inny sposób dołączyć numer do tablicy bez modyfikowania dwóch plików?
To jest C, nie C++, w przeciwnym razie użyłbym instancji klasy z konstruktorem, który zapisałby do tablicy. Somethink tak:
struct __header1{ __header1() {
global_array[global_array_ptr++] = 100;
} } __header1_inst;
a następnie przekształcić go w ładny makro:
#define register(hdr, func) struct __header##hdr{ __header##hdr() { \
global_array[global_array_ptr++] = func; \
} } __header##hdr##_inst;
register(1, 100) // header1.h
register(2, 200) // header2.h
Nie sądzę, że to możliwe. Jeśli jesteś otwarty na to, oto propozycja alternatywnego podejścia: http://stackoverflow.com/a/4152185/182748 – asveikau
Ustaw większą tablicę niż potrzebujesz. –
'Mam wiele plików nagłówkowych, każdy z nich musi dodać numer do tablicy, aby zarejestrować jego funkcje." To jest problem, jest to zły projekt programu pełnego ścisłego sprzężenia. W projektowaniu obiektowym każdy moduł powinien być autonomiczny, z jak najmniejszą liczbą zależności. Nie wiem, jakie powinny być twoje "rejestry", więc trudno jest zaproponować najlepszy projekt programu, ale ponieważ rejestry są oczywiście ze sobą powiązane, powinny być obsługiwane przez jeden moduł. W razie potrzeby moduł rejestru może zostać dołączony do wszystkich tych nagłówków. – Lundin