2011-12-26 22 views
5

Oggi ho iniziato a lavorare sul codice FUSE opensource, non ci ho trovato poche righe come questo:Come interpretare la struttura senza definizione?

struct fuse_session; 
struct fuse_chan; 

non so come interpretarla, per quanto ne sapevo 'struct' è seguito dal nome della struttura e quindi il nome della variabile. Dove come in questo caso c'è solo un'entità con nome seguita da struct, quindi questa sessione di fusibili è una variabile di struttura o il nome della struttura stessa. Può essere una cosa molto semplice ma non riesco a trovarla da nessuna parte.

risposta

9

Questo è di solito utilizzato per una delle seguenti opzioni:

  1. si desidera consentire all'utente di qualche modulo di sapere che questo struct esiste, ma non voglio esporre il suo contenuto. Per esempio:

    in api.h:

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

    nel file 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; 
    } 
    

    In questo modo si incapsulare l'attuazione e può cambiare la struct seguito, se necessario, senza alcun impatto sul usando il modulo.

  2. Si desidera utilizzare una struttura (puntatore) prima di dichiararlo. Per esempio:

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

Una nota importante:

Se avete solo la dichiarazione struct, come nella tua domanda, non è possibile fare riferimento alla struct direttamente, né si può utilizzare l'operatore sizeof, solo dichiarare un puntatore alla struttura.

+0

@Binyanmin ringrazia per aver fornito una spiegazione illustrativa .. –

+2

@ user1115935, questo è anche chiamato dichiarazione di inoltro. –

0

ho trovato cose simili in file di intestazione fornito dall'API di alcune librerie. Alcune librerie non vogliono esporre i dettagli dei membri di alcune strutture utilizzate nella libreria ma hanno intenzione di utilizzare tali strutture come puntatori in tal caso lo fanno ...

0

Quelli sono tipi incompleti o tipi opachi, e sono utile quando l'interfaccia della libreria funziona solo con puntatori a quei tipi. Non è necessario compilare tutti i dettagli di ciò che è nelle strutture in modo che nessun codice esterno alla biblioteca possa mai accedere ai dati nella struttura (legittimamente). Il codice all'interno della libreria ha un'intestazione privata che fornisce i dettagli di ciò che è nelle strutture, quindi la libreria può effettivamente funzionare con i contenuti, ma questo è un dettaglio nascosto ai consumatori della libreria.

I tipi incompleti offrono una sicurezza del tipo molto migliore rispetto a un'altra alternativa utilizzata a volte, ovvero puntatori void. È troppo facile confondersi quando ci sono più tipi diversi tutti rappresentati da "void *". Con tipi incompleti, puoi distinguere correttamente tra i diversi tipi, ma non rivelare ancora i dettagli di come sono implementati.

2

È necessario avere una introduzione a forward declaration in C. Si prega di provare il collegamento this.

0

Forward Declaration questo aiuta il compilatore a risolvere i riferimenti di struttura da diverse parti di un programma.

Problemi correlati