2011-12-26 21 views
5

Dziś zacząłem pracować na kod FUSE opensource, tam znalazłem kilka wierszy tak:Jak interpretować strukturę bez definicji?

struct fuse_session; 
struct fuse_chan; 

ja nie wiem, jak je interpretować, tak dalece jak wiedziałem „struct” następuje nazwa struktury i to nazwa zmiennej. Gdzie, tak jak w tym przypadku, istnieje tylko jeden nazwany obiekt, po którym następuje struct, więc ta sesja bezpiecznika jest zmienną struktury lub samą nazwą struktury. Może to być naprawdę bardzo podstawowa rzecz, ale nie jestem w stanie jej znaleźć nigdzie.

Odpowiedz

9

ta jest zwykle używany do jednego z następujących powodów:

  1. chcesz, aby użytkownik jakiegoś modułu, aby wiedzieć, że ta struktura istnieje, ale nie chcą narazić jego zawartość. Na przykład:

    w api.h:

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

    w pliku wewnętrznego:

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

    ten sposób hermetyzacji wdrożenie i może zmienić struct później w razie potrzeby, bez żadnego wpływu na za pomocą modułu.

  2. Chcesz użyć struktury (wskaźnika) przed jej zadeklarowaniem. Na przykład:

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

Jedna ważna uwaga:

Jeśli masz tylko deklarację struct, jak w swoim pytaniu, nie można odwołać się do struktury bezpośrednio, ani nie można użyć operatora sizeof, deklaruj tylko wskaźnik do struktury.

+0

@Binyanmin dziękuję za udzielenie ilustracyjnego wyjaśnienia .. –

+2

@ user1115935, jest to również nazywane zgłoszeniem. –

0

Znalazłem takie rzeczy w tak w niektórych bibliotek biblioteki API pod warunkiem, plik nagłówkowy. Niektóre biblioteki nie chcą ujawniać szczegółów elementów jakiejś struktury używanej w bibliotece, ale zamierzali, aby aplikacja mogła używać tej struktury jako wskaźnika, w takim przypadku robią to ...

0

Są to rodzaje niekompletne lub nieprzezroczyste, a są one przydatne, gdy interfejs biblioteki działa tylko ze wskaźnikami do tych typów. Nie musisz wypełniać wszystkich szczegółów tego, co znajduje się w strukturach, więc żaden kod poza biblioteką nie może uzyskać dostępu do danych w strukturze (zgodnie z prawem). Kod wewnątrz biblioteki ma prywatny nagłówek, który dostarcza informacji o tym, co jest w strukturach, więc biblioteka może rzeczywiście pracować z zawartością, ale jest to szczegół ukryty przed konsumentami biblioteki.

Niekompletne typy zapewniają znacznie lepsze bezpieczeństwo typów niż inne, które są czasami używane, mianowicie wskaźniki pustych przestrzeni. Zbyt łatwo jest się pomylić, gdy istnieje wiele różnych typów reprezentowanych przez "void *". W przypadku niekompletnych typów można prawidłowo rozróżnić różne typy, ale nadal nie ujawniają szczegółów sposobu ich implementacji.

2

Powinieneś uzyskać wprowadzenie do forward declaration w C. Wypróbuj link this.

0

Forward Declaration pomaga to kompilatorowi w rozwiązywaniu odniesień do struktury z różnych części programu.

Powiązane problemy