2009-07-30 11 views
11

Creo que he leído en algún lugar que es ilegal tomar la dirección de un valor enum en C (los valores enum no son lvalues; sin embargo, no puedo encontrar ninguna información sobre esto ahora). ¿Es correcto y, si es así, por qué?Ubicación de la memoria del valor enum en C


Editar:

Aquí hay un ejemplo que aclara lo que quiero decir con "valor de enumeración" por encima. Me refiero a tomar la dirección de first_value a continuación, no tomar la dirección de un caso real de una enumeración:

enum myenum 
{ 
    first_value, 
    second_value 
}; 
+0

Esa enumeración existe solo en la memoria del compilador, no en el ejecutable. Deberá crear una instancia de la enumeración para que aparezca en el ejecutable. – Anonym

Respuesta

24

"Valor de Enum" es ligeramente ambiguo; Sin embargo, supongo que te refieres lo siguiente:

enum myenum 
{ 
    first_value, 
    second_value 
}; 

En este caso, es ilegal tomar la dirección de first_value. La razón para esto es que first_value no existe realmente en la memoria en ninguna parte ... es solo una constante, efectivamente otro nombre para el número 0 (del cual, por supuesto, tampoco puede tomar la dirección).

Si, por el contrario, quiere decir que si usted puede tomar la dirección de una variable que se declara como una enumeración:

enum myenum x; 
enum myenum *mypointer=&x; 

entonces eso es definitivamente posible.

+1

¿Por qué el voto a favor? –

+2

Todos obtuvieron una parte de la maravilla de SO, supongo. –

+0

Gracias! Sí, fue ambiguo. Aclaré la pregunta con el primer ejemplo de tu respuesta. – olovb

18

si tiene:

enum E { 
    X, Y, Z 
}; 

entonces usted no puede tomar las direcciones de X, Y o Z, más de lo que usted puede tomar las direcciones de 0, 1 ó 2.

Sin embargo, se puede tomar la dirección de una instancia de enumeración:

typedef enum { 
    X, Y, Z 
} E; 

int main() { 
    E e; 
    E * ep; 
    ep = & e; 
} 
5

Los nombres de valor para las enumeraciones son solo alias constantes para enteros, por lo que no tiene sentido intentar tomar su dirección. Puede tomar la dirección de una variable enum bien, por supuesto.

+0

Los valores enum son constantes, pero no son macros. En la mayoría de los aspectos, por supuesto, funcionan de manera similar a las constantes definidas mediante macros, pero son diferentes en algunas formas sutiles: están sujetas a la definición del alcance, por ejemplo, mientras que las macros no lo son. –

+0

Ciertamente no son #defines o macros. Es posible que desee volver a escribir esto. –

+0

Sí, Jesús, subestimé profundamente la pedantería que encontraría. Mea maxima effing culpa. Todo mejor ahora – chaos

0

Por lo que recuerdo, las enumeraciones en C son solo enteros. Así que sería como señalar a la variable local.

+1

Un puntero a una variable local es una cosa perfectamente válida en C. –

+0

Es verdad, hace mucho tiempo que no uso C. Hay momentos en los que siento que todavía sé algo, como un PM que era un programador Hace 10 años ... Debería votar por mí mismo –

10

enumeraciones se utilizan para reemplazar #define cadenas:

#define SUCCESS 0 
#define LITTLE_ERROR 1 
#define BIG_ERROR 2 

Esto se puede sustituir con:

enum 
{ 
    SUCCESS, 
    LITTLE_ERROR, 
    BIG_ERROR 
}; 

Un valor de enumeración como SUCCESS es meramente un símbolo para un número entero constante, que ganó' Puede almacenarse en cualquier lugar de la memoria del programa. Por lo tanto, no tiene sentido tomar su dirección.

2

pls refieren el siguiente ejemplo:

enum { FIRST,SECOND } var; 

aquí la FIRSTSECOND y macros son constantes.Por lo tanto & operador no va a funcionar, ya que no se almacena en la memoria

Pero para var se le asignará una posición de memoria y el operador & se puede utilizar.

Cuestiones relacionadas