2012-04-30 34 views
10

Używam Kdevelop w Kubuntu. I zadeklarowały strukturę w moim datasetup.h pliku:Użycie struct w pliku nagłówkowym "nieznany typ" błąd

#ifndef A_H 
#define A_H 

struct georeg_val { 

    int p; 
    double h; 
    double hfov; 
    double vfov; 
}; 

#endif 

Teraz gdy używam go w moim pliku main.c

int main() 
{ 
    georeg_val gval; 

    read_data(gval); //this is in a .cpp file 

} 

pojawia się następujący błąd:

georeg_chain.c:7:3: error: unknown type name 'georeg_val'

(To jest w linii georeg_val gval;)

Byłbym wdzięczny, gdyby ktoś mógł pomóc mi rozwiązać ten błąd.

+0

Czy mieszania C i C++ razem tutaj? –

+0

Upewnij się, że importujesz nagłówek: 'import" datasetup.h "'. – piperchester

Odpowiedz

21

W jednym C ma dwie możliwości zadeklarować strukturę:

struct STRUCT_NAME {} ; 

lub

typedef struct {} STRUCT_ALIAS; 

Jeśli używasz pierwszą metodę (podać struct nazwę) - należy zdefiniować zmienną zaznaczając go jednoznacznie jako a struct:

struct STRUCT_NAME myStruct; 

jednak jeśli używasz drugiej metody (struct dać się innymi s), a następnie można pominąć struct identyfikator - kompilator może wywnioskować typ zmiennej podany jest jedynie to alias:

STRUCT_ALIAS myStruct; 

punkty bonusowe: Można zadeklarować struct zarówno jego nazwę i alias:

typedef struct STRUCT_TAG {} STRUCT_TAG; 
// here STRUCT_NAME == STRUCT_ALIAS 

Następnie w zmiennej definicji możesz użyć pierwszej lub drugiej metody. Dlaczego oba te dwa światy są dobre? Alias ​​strukturalny pozwala skrócić definicje zmiennych strukturalnych - co czasami jest dobre. Ale nazwa struktury pozwala ci wykonać forward declarations. Która jest niezbędnym narzędziem w niektórych przypadkach - rozważyć masz okrągłe odniesień między kodowanym:

struct A { 
    struct B * b; 
} 
struct B { 
    struct A * a; 
} 

Poza tym, że ta architektura może być wadliwy - to okrągły definicja kompilacji gdy struktury są zadeklarowane w pierwszy sposób (z nazwami) I struct Wskaźniki są jawnie przywoływane przez oznaczenie ich jako struct.

6

Jeśli musisz zdefiniować nowy typ, musisz napisać:

typedef struct { 

    int p; 
    double h; 
    double hfov; 
    double vfov; 
} georeg_val ; 

Następnie można użyć georeg_val jako nowego typu.

+4

Lub przełącz na 'struct georeg_val gval;' in 'main' –

+1

@dead_jake Również' # include' plik nagłówkowy w main.c (jeśli jeszcze tego nie zrobiłeś) – Praetorian

3

Definiowanie typu struct (na tym przykładzie, binarne drzewo poszukiwań struct):

struct tree { 
    int info; 
    struct tree *left; 
    struct tree *right; 
} 

typedef struct tree treeNode; 

Deklarowanie funkcji np .:

treeNode *insertElement(treeNode *treeA, int number);