2009-07-28 4 views
5

Il problema che ho è che ho due enumerazioni in due file diversi che dovrebbero avere gli stessi gruppi di costanti (due processi diversi sono generati dai due file lungo con altri file). Voglio che l'enumerazione sia sincronizzata, cioè quando qualcuno aggiunge un nuovo valore a enum x e dimentica di aggiornare l'altro enum, voglio lanciare un errore di compilazione. È possibile?Programma C - verifica se due enumerazioni sono sincronizzate al momento della compilazione

risposta

11

Perché non state inserendo questa dichiarazione in un singolo file di intestazione e quindi includendola nelle due posizioni necessarie?

+0

Voglio sapere se una cosa del genere può essere fatta in fase di compilazione. –

+0

Per quanto ne so non è possibile in fase di compilazione. Ovviamente potresti scrivere un pre-preprocessore ed eseguirlo prima di chiamare gcc (o qualsiasi altra cosa tu usi). Questo pre-preprocessore genererebbe entrambi i file o uno di questi dall'altro. – Gregor

+0

@Gregor, hmmm. Buona chiamata, è possibile generare le copie multiple della dichiarazione pertinente come fase separata prima di iniziare la compilazione stessa. –

5

Ciascuna delle enumerazioni termina con un enum noto, ad esempio LAST_ENUM_1 e LAST_ENUM_2. Utilizzare un #if in un file che ha accesso a entrambi i file di intestazione per confrontare.

#if LAST_ENUM_1 != LAST_ENUM_2 
    #error Enums have different sizes 
#endif 
+0

+1 Bella idea. Non sapevo che ci fosse qualcosa come "# errore". – Gregor

+0

Penso che #error sia parte dello standard. Di solito c'è anche un #warning (o simile) ma non fa parte dello standard C. – Robert

+0

I valori delle costanti enum sono disponibili anche per il preprocessore? Penso che non lo siano, quindi il controllo finale dovrebbe essere eseguito in runtime ... – Tobi

0

I nomi usati in enumerazioni bisogno di essere ambiguo, quindi dovrete avere un problema: o il compilatore ha accesso a entrambe le definizioni, poi le enumerazioni non possono essere identici a causa del problema nome o il compilatore ha accesso a una sola definizione per volta, quindi non ha nulla da controllare.

Anche il numero di elementi (come proposto da Robert) non può essere controllato in fase di compilazione (il preprocessore non sa nulla delle enumerazioni). Se davvero non si può avere un file di intestazione comune, la cosa più semplice da fare sarebbe un controllo di runtime all'inizio dell'applicazione.

0

uso come

enum EMyEnum 
{ 
    JOE = 0, 
    BLACK = 1, 
    WHITE = 2, 

    END_OF_ENUM = 3 
} 

se si utilizza come quello formato, forse si può gestire tutto più facile

+1

Alla fine non metterei "= 3" perché è un'altra cosa che devi ricordare di cambiare quando aggiungi un enum. – Robert

1

mi piace molto le altre risposte migliori di quello io suggerisco ora ...

Se tutte le altre soluzioni non funzionano, scrivi un semplice script perl che verifica se sono uguali e assicurati che lo script perl sia chiamato dal tuo makefile. Risolverà il tuo problema, ma cerca di evitare se puoi.

0

Poiché il compilatore esamina un file sorgente (unità di traduzione, TU) alla volta, non c'è modo di lamentarsi di una mancata corrispondenza tra la TU corrente e altre TU che non sta guardando.

È necessario correggere le cose in modo da avere una copia della definizione dell'enum utilizzata da entrambi i programmi, quindi appartiene a un'intestazione inclusa da entrambi. Praticamente qualsiasi altra cosa è troppo incline all'errore per il comfort.

Problemi correlati