Incrustado c aquí. Uno de nuestros socios nos envió los prototipos de API de las funciones de la biblioteca que están utilizando. Hay una enumeración como:

typedef enum{
     val1 = 0, 
     val2 = 1, 
    [..]
} status;

A continuación, el tipo de enumeración se define como una estructura:

typedef struct status status_t;

¿Cuál es el significado de este typedef? ¿Tiene algún significado práctico? ¿Tengo que manejarlo como una estructura regular? Creo que con este enfoque puedo convertir un enumerador en una estructura y puedo acceder a un miembro de la estructura, pero no estoy seguro. Cualquier sugerencia sería muy apreciada. B.R. L.

En arm-gcc, GNU c99

5
Catosh 19 feb. 2018 a las 16:15

2 respuestas

La mejor respuesta

Estos son dos tipos diferentes.

Los nombres de las estructuras están en su propio espacio de nombres. Entonces struct status es diferente de status. El primero es el nombre de una estructura, mientras que el segundo es un typedef que se refiere a un enum sin nombre.

El hecho de que el nombre de typedef asignado a una enumeración sea el mismo que el nombre de etiqueta dado a una estructura no significa que estén asociados de ninguna manera en lo que respecta al compilador.

5
dbush 19 feb. 2018 a las 13:25

Considere el siguiente código válido :

typedef enum
{
     STATUS1 = 0, 
     STATUS2 = 1
} status ;


// struct tag
//         |
//         V
struct status
{
    status status ;
    //  ^    ^
    //  |    |_______
    //  |           |
    // type_name  member_name
} ;

typedef struct status status_t ;
//                       ^
//                       |
//                      Type alias
int main()
{

    // The following is valid    
    status_t status_structure ;
    status_structure.status = STATUS1 ;

    // So is this    
    struct status status ;
    status.status = STATUS1 ;


    return 0;
}

El nombre del tipo status es distinto tanto del nombre del miembro status como de la etiqueta de estructura status. En algún lugar del código dado, o posiblemente no incluido pero necesario, hay una definición separada de una estructura también llamada status.

En C, la etiqueta struct por sí sola no es un identificador de tipo, por lo que no hay ambigüedad struct status no es del mismo tipo que el alias de tipo enum status. No es necesariamente una buena idea, pero no es inválida. Por supuesto, fallaría si se usara la compilación de C ++ porque entonces para struct status, status sería un nombre de tipo, por lo que chocaría con el alias de enumeración status.

3
Clifford 19 feb. 2018 a las 15:44