2013-05-27 20 views
5

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

Non credo sia possibile. Se sei aperto a questo, ecco un suggerimento per un approccio alternativo: http://stackoverflow.com/a/4152185/182748 – asveikau

+0

Rendi l'array più grande del necessario. –

+1

'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

risposta

1

IMHO, questo è un hack e vorrei consigliare contro di essa. Anche se fosse possibile farlo in C, considera la situazione in cui uno di questi file di intestazione è incluso in diversi moduli. Ci sarà una voce identica nell'array globale per ogni modulo di questo tipo. Quindi, anche se è possibile farlo in C++, l'ordine di inizializzazione dell'oggetto globale is undefined, quindi l'inizializzazione di un altro oggetto globale che si basa sui contenuti dell'array globale sarà inaffidabile.

Inoltre, questo è un modo davvero complicato per fare una cosa semplice e ne oscura considerevolmente il significato. A prescindere dal fatto che il codice di riempimento della matrice sia di per sé complesso, il monitoraggio include diventa gravoso quando le dipendenze vanno oltre la banalità. Quindi, basta riempire quell'array globale in un posto specifico esplicitamente.

Problemi correlati