2012-06-30 11 views
5

Devo scrivere alcune costanti in file diversi con un ID intero. Per esempio:Valori interi in fase di compilazione

#define MESSAGE_FIRST 0 

In un altro file:

#define MESSAGE_ANOTHER 1 

dei modi per ottenere che id automaticamente in tempo di compilazione? Qualcosa di simile:

#define MESSAGE_AUTO GetNextId() 

Non riesco a utilizzare le enumerazioni qui perché queste direttive saranno in file diversi.

Grazie.

p.s. GCC, Linux

+0

Lo standard non ha qualcosa come \ _ \ _ COUNTER \ _ \ _ (simile a \ _ \ _ LINE \ _ \ _) AFAIK. post scriptum Nel mio preprocessore ho questo. –

+0

Non riesco a pensare a un modo per farlo al di fuori della generazione di codice esterno. Ma forse se fornisci una descrizione più approfondita del vero problema che stai cercando di risolvere, possiamo darti una soluzione migliore. –

+1

Devono essere in file diversi? Oppure possono tutti includere un singolo file di intestazione con questi valori in? – Matt

risposta

5

si può fare un contatore in fase di compilazione, con l'ereditarietà e la funzione sovraccarico:

template<unsigned int n> struct Count { bool data[n]; }; 
template<int n> struct Counter : public Counter<n-1> {}; 
template<> struct Counter<0> {}; 
Count<1> GetCount(Counter<1>); 

#define MAX_COUNTER_NUM 64 
#define COUNTER_VALUE (sizeof(GetCount(Counter<MAX_COUNTER_NUM + 1>()))/sizeof(bool)) 
#define INC_COUNTER Count<COUNTER_VALUE + 1> GetCount(Counter<COUNTER_VALUE + 1>); 

lo si può vedere in azione here. Funziona anche con msvc.

1

Si dice che si sta utilizzando GCC. GCC ha la macro (AFAIK per file) denominata __COUNTER__ che aumenta di uno dopo l'uso.

Si noti che questa è un'estensione e non è inclusa nel C++ standard.

Un'altra opzione sta usando un enum:

enum { 
    FIRST = 0, 
    SECOND, 
    THIRD 
}; 

Oppure si può farlo usando manualmente direttive del preprocessore come questo:

#define FIRST 0 
#define SECOND (1 + FIRST) 
#define THIRD (1 + SECOND) 
+0

Che ne dici dell'ultimo suggerimento: questo è utile quando tutto è un file, ho bisogno di diversi e alcuni programmatori modificheranno questo codice in modo da possibili conflitti. – Ockonal

+2

Si prega di utilizzare Parens quando si definisce SECONDO e TERZO. – robert

+0

@robert: hai ragione, corretto. – orlp

Problemi correlati