Qualcosa di simile:
struct MyStruct;
è chiamato un riferimento in avanti. Crea un tipo incompleto e dice al compilatore che ci sarà un tipo di quel nome (ed è una struttura - funziona allo stesso modo per i sindacati), ei dettagli "seguono dopo". Di questo tipo non è possibile definire variabili, fino a quando non si completa il tipo.
typedef struct MyStruct MyType;
Definirà semplicemente il nome del tipo come struttura. Questo è ancora un tipo incompleto.
Tuttavia, si può prendere un puntatore ad un tipo incompleto:
MyType *my_t_pointer;
struct MyStruct *my_s_pointer;
Questo è utile per una struttura di avere puntatori a oggetti dello stesso tipo quando si fornisce la dichiarazione completa, "completare" il tipo :
struct MyStruct {
struct MyStruct *next;
};
in realtà questo è l'unico modo per creare nodi per liste, alberi, e tutti gli altri-strutture dati ricorsive. Questa è una parte importante dei programmi C (a volte nascosti).
Inoltre, questo meccanismo viene utilizzato per nascondere i dettagli di implementazione. Le funzioni nell'intestazione devono solo conoscere la struttura esistente per prendere/passare i puntatori ad essa. L'uso di queste funzioni non deve conoscere i dettagli della struttura (ma in questo modo non può allocarlo, quindi il modulo deve coprire tutti gli aspetti che necessitano di conoscere i dettagli sulla struttura). La dichiarazione completa è solo all'interno del file di implementazione del modulo. Questi puntatori sono chiamati "opachi" in quanto non è possibile "guardare attraverso", cioè accedere ai campi della struttura in quanto semplicemente non sono noti ad esso.
my_module.h:
struct MyStruct;
extern void my_init(struct MyStruct *obj);
my_module.c:
struct MyStruct {
int f1;
...
};
my_init(struct MyStruct *obj)
{
...
}
strutture C sono nominalmente digitati, cioè identità tipo all'interno di un'unità di traduzione è determinato dal nome; 'struct name' è sufficiente per dichiarare un nuovo tipo, ma il tipo sarà incompleto finché non verrà trovata un'altra dichiarazione completa (definizione aka); puoi avere dei puntatori agli oggetti con tipo incompleto, ma ovviamente non potrai accedere ai membri o usarli per dichiarare le variabili; una dichiarazione di tipo incompleta è anche nota come dichiarazione anticipata; uno dei suoi usi sono i puntatori opachi – Christoph
@ Michael Heidelberg "Sappiamo tutti come dichiarare una struttura in C" - dopo la tua domanda non sono sicuro che sia vero. :) –