2011-12-09 12 views
6

pregunta rápida:Enumeración Ámbito

Si tengo enumeraciones como:

enum EnumA 
{ 
    stuffA = 0 
}; 
enum enumAA 
{ 
    stuffA = 1 
}; 

¿Qué ocurre aquí cuando se hace referencia a stuffA? Pensé que te referirías a ellos como EnumA.stuffA y EnumB.stuffA como en Java, pero ese no parece ser el caso.

Gracias por cualquier idea

Editar-Gracias por las respuestas rápidas!

Respuesta

7

enums no introducir un nuevo alcance.

En su ejemplo, el segundo enum no se compilará debido al choque de nombre stuffA.

Para evitar los conflictos de nombres, es una práctica común dar a los elementos de un enum un prefijo común. Prefijos diferentes se utilizan para diferentes enumeraciones:

enum EnumA 
{ 
    EA_stuffA = 0 
}; 
enum EnumAA 
{ 
    EAA_stuffA = 1 
}; 
+0

Entonces, si quisiera lograr algo como lo anterior (alcance limitado), ¿una estructura sería mi única/mejor apuesta? – prelic

+0

Tendría que usar algo: 'enum EnumA {enumA_stuffA = 0}; enum enumAA {enumAA_stuffA = 1}; ' –

5

Las constantes de enumeración se encuentran en el espacio de nombres global (más precisamente, las identificadores ordinarios espacio de nombres, en contraste con las etiquetas, espacios de nombres de etiquetas, y la estructura de miembros/Unión), por lo que obtiene un error de compilación en el segundo stuffA.

No puede usar dos valores diferentes para el mismo nombre de enumeración (ni el mismo valor especificado dos veces) en una sola unidad de traducción.

1

Como se mencionó, esto no se compilará porque stuffA se define dos veces. Los valores de Enum simplemente se refieren a la enumeración (que es "stuffA" en lugar de EnumA.stuffA). Incluso puede usarlos en tipos que no son enumeraciones (como enteros). Enumeraciones a veces se utilizan de esta manera con Ints, similar a la forma en que #definir constantes.

+2

En C, las constantes' enum' * son * 'int' por definición del estándar. –

3

Como los demás ya dijeron que las constantes de enumeración deben ser únicas en el alcance real donde están definidas. Pero con ellos como con otros identificadores, se permite redefinirlos en otro ámbito. P.ej.

enum EnumA 
{ 
    stuffA = 0 
}; 

void func(void) { 
    enum enumAA 
    { 
    stuffA = 1 
    }; 
    // do something 
} 

estaría bien. Pero tales redefiniciones en diferentes ámbitos a menudo son desaprobadas y deberían estar bien documentadas, de lo contrario se perderán rápidamente a sí mismos y a los demás.

+3

+1 Y, afortunadamente, gcc con '-Wshadow' da' advertencia: la declaración de 'stuffA' sombrea una declaración global'. –