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
Perché non state inserendo questa dichiarazione in un singolo file di intestazione e quindi includendola nelle due posizioni necessarie?
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
+1 Bella idea. Non sapevo che ci fosse qualcosa come "# errore". – Gregor
Penso che #error sia parte dello standard. Di solito c'è anche un #warning (o simile) ma non fa parte dello standard C. – Robert
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
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.
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
Alla fine non metterei "= 3" perché è un'altra cosa che devi ricordare di cambiare quando aggiungi un enum. – Robert
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.
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.
- 1. Rileva C# versione al momento della compilazione
- 2. ID tipo C++ al momento della compilazione
- 3. Genera numeri univoci al momento della compilazione
- 4. stampa sizeof (T) al momento della compilazione
- 5. C++: disambigua questo codice al momento della compilazione?
- 6. Come testare UIViewControllers al momento della compilazione?
- 7. Determina la lunghezza della stringa netta al momento della compilazione
- 8. Do C# lambdas esiste solo al momento della compilazione?
- 9. Quando due enumerazioni sono uguali in C#?
- 10. display intero al momento della compilazione a static_assert()
- 11. L'UB garantito può essere rifiutato al momento della compilazione?
- 12. Leggere un file in una stringa al momento della compilazione
- 13. Rileva la presenza del modello al momento della compilazione
- 14. Scala - Imposizione della dimensione del vettore al momento della compilazione
- 15. Piattaforma/processore di destinazione al momento della compilazione
- 16. Gli array possono essere indicizzati al momento della compilazione?
- 17. Forza una stretta coercizione implicita al momento della compilazione
- 18. Come si generano staticamente dati float al momento della compilazione?
- 19. Valutare una funzione al momento della compilazione con Template Haskell
- 20. Qual è un valore noto al momento della compilazione?
- 21. Convalida il contenuto di std :: initializer_list al momento della compilazione
- 22. dedurre intero spazio vettore al momento della compilazione
- 23. Perché la località viene determinata al momento della compilazione?
- 24. catch std :: allocazioni di funzioni al momento della compilazione
- 25. Visualizzare le viste al momento della compilazione VS2010?
- 26. Come confrontare statisticamente due stringhe di caratteri al momento della compilazione
- 27. come applicare tipo non generico al momento della compilazione
- 28. Errore gradle Studio Android al momento della compilazione
- 29. intermediario - percorso risorsa per CDN al momento della compilazione
- 30. Perché Java associa le variabili al momento della compilazione?
Voglio sapere se una cosa del genere può essere fatta in fase di compilazione. –
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
@Gregor, hmmm. Buona chiamata, è possibile generare le copie multiple della dichiarazione pertinente come fase separata prima di iniziare la compilazione stessa. –