2011-12-26 17 views
5

Hoy empecé a trabajar en fusible Código de código abierto, no he encontrado pocas líneas como esta:¿Cómo interpretar la estructura sin definición?

struct fuse_session; 
struct fuse_chan; 

que no sé cómo interpretarlo, por lo que yo sabía 'struct' es seguido por su nombre y estructura luego el nombre de la variable. Donde como en este caso solo hay una entidad con nombre seguida de struct, entonces esta sesión de fusibles es una variable de estructura o un nombre de estructura en sí mismo. Puede ser algo realmente básico pero no puedo encontrarlo en ninguna parte.

Respuesta

9

Esto se utiliza generalmente para una de las siguientes:

  1. desea permitir que el usuario de algún módulo de saber que esta estructura existe, pero no quiere exponer a su contenido. Por ejemplo:

    en api.h:

    struct bar; 
    
    void GetStruct(struct bar *); 
    void SetActive(struct bar *, char); 
    

    en su archivo interno:

    struct bar { 
        char is_active; 
    }; 
    
    void GetStruct(struct bar * st) { 
        st = malloc(sizeof(struct bar)); 
    } 
    
    void SetActive(struct bar * st, char active) { 
        if (st != NULL) 
         st->is_active = active; 
    } 
    

    De esta manera encapsular la implementación y puede cambiar la estructura tarde si es necesario sin ningún impacto en el usando el módulo.

  2. Desea utilizar una estructura (puntero) antes de declararlo. Por ejemplo:

    struct bar; 
    typedef int (*FooFuncType)(struct bar *); 
    struct bar { 
        FooFuncType a_func;   
    }; 
    

Una nota importante:

Si sólo tiene la declaración de estructura, como en su pregunta, no se puede hacer referencia a la estructura directamente, ni se puede utilizar el operador sizeof, solo declara un puntero a la estructura.

+0

@Binyanmin gracias por dar una explicación ilustrativa .. –

+2

@ user1115935, esto también se denomina declaración directa. –

0

encontré cosas así en archivo de encabezado provisto API de alguna biblioteca. Algunas bibliotecas no quieren exponer los detalles de los miembros de alguna estructura utilizada en la biblioteca, pero intentan utilizar la estructura como puntero en ese caso ...

0

Esos son tipos incompletos o opacos, y son útil cuando la interfaz de la biblioteca solo funciona con punteros a esos tipos. No es necesario que complete todos los detalles de lo que hay en las estructuras para que ningún código fuera de la biblioteca pueda acceder a los datos en la estructura (legítimamente). El código dentro de la biblioteca tiene un encabezado privado que proporciona los detalles de lo que hay en las estructuras, por lo que la biblioteca puede funcionar con los contenidos, pero eso es un detalle oculto para los consumidores de la biblioteca.

Los tipos incompletos proporcionan un tipo de seguridad mucho mejor que otra alternativa que se utiliza a veces, a saber, punteros vacíos. Es muy fácil confundirse cuando hay varios tipos diferentes, todos representados por 'void *'. Con tipos incompletos, puede distinguir correctamente entre los diferentes tipos, pero aún no revelar los detalles de cómo se implementan.

2

Debe obtener una introducción a forward declaration en C. Intente el enlace this.

0

Forward Declaration esto ayuda al compilador a resolver las referencias de estructura de diferentes partes de un programa.

Cuestiones relacionadas