2017-05-14 2 views
0

Ich habe drei DateienVariable war mit einem nie abgeschlossen Typ deklarieren

  • main.c
  • myStruct.h
  • myStruct.c

ich einige Post gelesen, wo man Definieren Sie eine Struktur und Kapselung und ich möchte meine Struktur in der Header-Datei deklarieren und in der Quelldatei definieren.

Das habe ich getestet.

myStruct.h

// myStruct.h 
#include "stdint.h" 

typedef struct myStruct myStruct_type; 

myStruct.c

// myStruct.c 
#include "myStruct.h" 

struct myStruct { 
    uint32_t itemA; 
    uint32_t itemB; 
    uint32_t *pointerA; 
    uint32_t *pointerB; 
}; 

main.c

// main.c 
#include "myStruct.h" 

myStruct_type testStruct; // This is where I get the error message 

int main (void) { 
    while (1); 

    return 0; 
} 

Wenn ich versuche zu kompilieren (Keil uVision) bekomme ich folgende Fehlermeldung „Variable 'testStruct' wurde mit einem nie fertiggestellten Typ deklariert. myStruct_type testStruct "

Was habe ich verpasst?

+0

Die Strukturdefinition muss an jedem Punkt sichtbar sein, an dem sie benötigt wird. Verschieben Sie es von der c-Datei in die h-Datei. –

+0

Verschieben Sie 'struct myStruct' in die Header-Datei. Sonst ist es für main.c nicht sichtbar. – kaylum

+0

Alternativ kann etwas wie 'myStruct_type * new_myStruct_type (void) {return malloc (sizeof (myStruct_type)); } 'in' myStruct.c' und in 'main()' definiere einfach 'myStruct_type * pmyStruct = new_myStruct_type();'. – alk

Antwort

2

Sie können testStruct nicht so deklarieren, myStruct_type ist ein unvollständiger Typ. Sie können bestenfalls einen Zeiger deklarieren.

So

myStruct_type testStruct; 

mit

myStruct_type *testStruct; 

Sie können wie daran denken ändern, während Compiler main.c Kompilieren es keine Informationen in myStruct_type auf Mitglieder hat, so kann er die Größe nicht berechnen der Struktur.

+0

Ja, danke für die Erklärung. – RedSmolf

+0

Es bedeutet, dass Sie nicht direkt auf die Mitglieder zugreifen können, Sie müssten dafür Funktionen erstellen. Dies ist üblich, wenn Sie etwas offen legen möchten, das verwendet werden muss, um den Status außerhalb Ihrer Bibliothek zu halten, ohne die internen Strukturen freizulegen. Dies ist hauptsächlich geeignet für z.B. Bibliotheken, in denen Sie intern einen privaten Header verwenden, aber nur einen Dummy-Typ in Ihrem öffentlichen Header definieren. Auf diese Weise können Sie eine stabile API erstellen, da Sie problemlos Mitglieder zwischen Versionen hinzufügen/entfernen können, ohne die API zu beeinflussen. Wenn Sie keine Bibliothek schreiben, sollten Sie sich nicht darum kümmern. – Cheatah