2011-01-15 22 views
0

Im angegebenen Code-Snippet habe ich den Fehler symbol Record not found erwartet. Aber es kompilierte und lief gut auf Visual Studio 2010 Compiler. Ich lief es als C-Programm von Visual Studio 2010-Eingabeaufforderung in der Art und Weise -C Struct: typedef Zweifel!

cl Record.c
Rekord

Nun ist die Frage steht, nicht typedef Check für Symbole? Funktioniert es eher wie ein forward declaration?

#include "stdio.h" 
#include "conio.h" 

typedef struct Record R; 
struct Record 
{ 
    int a; 
}; 

int main() 
{ 
    R obj = {10}; 
    getch(); 
    return 0; 
} 
+0

Versuch 'typedef struct Nehmen R zu setzen;' unter ' struct Record ... ' – xhan

+0

@xhan - Wenn ich es mache, ist es sinnvoll, weil das Symbol' Record' früher gefunden wird. Vielen Dank. – Mahesh

+0

Ihr Code lief gut unter GCC (musste getch to getchar ändern) und VS2005. Ich vermute, deine Befunde stimmen. – karlphillip

Antwort

1

Sie können immer auf undefinierte Strukturen verweisen, was eine typische Art ist, verknüpfte Listen zu implementieren. Sie müssen nur definiert werden, wenn Sie ihre Felder verwenden möchten. This page enthält einige Details.

0

C findet das Symbol Record nicht, weil es später im Code deklariert wird, als ob Sie versuchen würden, eine Funktion zu verwenden, die Sie für den Code deklarieren, ohne dessen Prototyp zu definieren.

Sie können auch die beiden Erklärungen kombinieren, und dann wird es:

typedef struct Record 
{ 
    int a; 
} R; 

Es funktioniert auch und, meiner Meinung nach, noch besser, nicht, weil es schneller sein kann, sondern weil es kleiner ist.

+0

kleiner ist typedef struct {int a; } R; – user411313

0

typedef muss verwendet werden, nachdem der erste Parameter definiert wurde.

struct Record 
{ 
    int a; 
}; 
typedef struct Record R; 

oder

typedef struct Record 
{ 
    int a; 
} R; 

Wenn Sie struct Record innerhalb der Struktur verwenden müssen, nur struct Record verwenden:

typedef struct Record 
{ 
    struct Record *next; 
} 
typedef struct Record R;