Ho più file di intestazione, ognuno di essi deve aggiungere un numero a un array per registrare le sue funzioni.C append a un array nel file di intestazione
Attualmente ho una funzione con un nome univoco in ciascun file di intestazione e nel file di programma ho bisogno di chiamare tutte quelle funzioni in una funzione di combinazione.
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
Ma questo è abbastanza scomodo perché ho bisogno di modificare in due punti quando aggiungo o rimuovo i file di intestazione. Meglio sarebbe modificare solo il file di intestazione. Stavo pensando a un preprocessore definire, quindi in ogni intestazione posso solo usare qualcosa come:
#define Registered Registered,100 // header1.h
#define Registered Registered,200 // header2.h
int registered[] = {Registered}; // main.c
Ma questo, naturalmente, non si compila, perché nuova definiscono ridefinisce quello vecchio. Quindi c'è un modo per aggiungere una definizione? O altro modo per aggiungere un numero a un array senza modificare due file?
Questo è C, non C++, altrimenti utilizzerei un'istanza di classe con il costruttore che scriverebbe semplicemente su un array. Somethink così:
struct __header1{ __header1() {
global_array[global_array_ptr++] = 100;
} } __header1_inst;
e quindi convertirlo in un bel macro:
#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
Non credo sia possibile. Se sei aperto a questo, ecco un suggerimento per un approccio alternativo: http://stackoverflow.com/a/4152185/182748 – asveikau
Rendi l'array più grande del necessario. –
'Ho più file di intestazione, ognuno di essi deve aggiungere un numero a un array per registrare le sue funzioni. Questo è dove si trova il problema, questo è un cattivo programma di progettazione pieno di accoppiamento stretto. Nella progettazione orientata agli oggetti, ogni modulo dovrebbe essere autonomo, con il minor numero possibile di dipendenze. Non so quali siano i tuoi "registri", quindi è difficile suggerire il miglior design del programma, ma dal momento che i registri sono ovviamente correlati tra loro, dovrebbero essere gestiti da un modulo. Il modulo di registro può quindi essere incluso da tutte quelle intestazioni, se necessario. – Lundin