2012-06-30 12 views
5

Tengo que escribir algunas constantes en diferentes archivos con alguna identificación entera. Por ejemplo:Valores enteros en tiempo de compilación

#define MESSAGE_FIRST 0 

En otro archivo:

#define MESSAGE_ANOTHER 1 

alguna manera de conseguir que la identificación automática en tiempo de compilación? Algo como:

#define MESSAGE_AUTO GetNextId() 

No puedo usar enumeraciones aquí porque estas instrucciones estarán en archivos diferentes.

Gracias.

p.s. GCC, Linux

+0

El estándar no tiene algo como \ _ \ _ COUNTER \ _ \ _ (similar a \ _ \ _ LINE \ _ \ _) AFAIK. PD. En mi propio preprocesador, tengo esto. –

+0

No puedo pensar en ninguna forma de hacerlo fuera de la generación de código externo. Pero tal vez si proporciona una descripción más completa del problema real que está tratando de resolver, podemos darle una mejor solución. –

+1

¿Deben estar en diferentes archivos? ¿O pueden todos incluir un único archivo de encabezado con estos valores? – Matt

Respuesta

5

Puede hacer un contador de tiempo de compilación, la herencia y la función sobrecarga:

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>); 

Usted puede verlo en acción here. También funciona con msvc.

1

Dice que está utilizando GCC. GCC tiene la macro (AFAIK por archivo) llamada __COUNTER__ que se incrementa en uno después de cada uso.

Tenga en cuenta que esta es una extensión y no está incluida en el estándar C++.

Otra opción es usar una enumeración:

enum { 
    FIRST = 0, 
    SECOND, 
    THIRD 
}; 

O puede hacerlo de forma manual mediante las directivas de preprocesador como este:

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

¿Qué hay de último consejo: esto es útil cuando todo es un archivo, necesito en diferentes y algunos programadores editarán este código para posibles conflictos. – Ockonal

+2

Utilice parens cuando defina SEGUNDO y TERCERO. – robert

+0

@robert: tienes razón, arreglado. – orlp

Cuestiones relacionadas