2013-05-27 16 views
5

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 
+0

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

+0

Ustaw większą tablicę niż potrzebujesz. –

+1

'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

Odpowiedz

1

IMHO, to jest hack i radziłbym przeciwko niemu. Nawet jeśli możesz to zrobić w C, rozważ sytuację, w której jeden taki plik nagłówkowy jest zawarty w kilku modułach. W każdym takim module będzie istnieć identyczny wpis w globalnej tablicy. Następnie, nawet jeśli możesz to zrobić w C++, kolejność globalnego inicjowania obiektu is undefined tam, więc inicjalizacja innego globalnego obiektu bazującego na zawartości globalnej tablicy będzie niewiarygodna.

Dodatkowo, jest to bardzo skomplikowany sposób na proste zadanie i znacznie zaciemnia znaczenie. Poza tym, że sam kod wypełniania tablic jest złożony, włączenie śledzenia stanie się uciążliwe, gdy zależności wykraczają poza trywialne. Tak, po prostu wypełnij tę globalną tablicę w określonym miejscu jawnie.

Powiązane problemy