PDA

Visualizza la versione completa : [C] Dichiarazione che fa uso di typedef


Ol3iconfini
10-02-2007, 17:01
Salve, stavo leggendo del codice C e mi sono trovato delle dichiarazioni che non capisco.
In un primo file header file.h c'è la seguente:


typedef struct struttura_pippo {
.
.
} PIPPO;


il cui significato dovrebbe essere dichiara la variabile PIPPO di tipo struttura_pippo che è una ridefinizione di struct.

In un secondo file c c'è la seguente dichiarazione:


#include "file.h"
.
.
PIPPO *point=NULL;


La mia perplessità nasce dalla dichiarazione della variabile point che dovrebbe essere di tipo struttura_pippo e non PIPPO.
Mi sbaglio?
Grazie per le osservazioni.
:ciauz:

oregon
10-02-2007, 17:07
Non consideri la parola

typedef

Quindi la prima parte e'

definisce un *nuovo tipo di dati*, chiamato PIPPO, equivalente alla struttura dati indicata.

Quindi point diventa un puntatore al nuovo tipo di dato.

Ol3iconfini
10-02-2007, 17:26
Quindi questo:


typedef struct struttura_pippo {
.
.
} PIPPO;

è diverso da questo:


typedef struct struttura_pippo;
struttura_pippo PIPPO{
.
.
};


???

Se così fosse, il significato sarebbe:
Definisci PIPPO come struttura di tipo struct struttura_pippo {. . .}.

Ma allora non era più logico scrivere direttamente:


struct PIPPO {
.
.
};


Senza bisogno di typedef e struttura_pippo???
:confused:

oregon
10-02-2007, 17:35
Originariamente inviato da Ol3iconfini


typedef struct struttura_pippo;



Questa scrittura e' sbagliata ... Quale tipo di dati stai definendo come sinonimo della struttura? Qual e' la struttura?

Ol3iconfini
10-02-2007, 17:45
Giusto per chiarire, c'è differenza tra questa:


typedef struct struttura_pippo {
int a;
int b;
} PIPPO;

e questa:


struct PIPPO {
int a;
int b;
};

????

oregon
10-02-2007, 17:59
Beh ... sì

Nella prima scrittura la struttura si chiama

struttura_pippo

e nella seconda la struttura si chiama

PIPPO

Sempre nella prima scrittura hai dichiarato un nuovo tipo di dati chiamato PIPPO che e' sinonimo della struttura.

Ol3iconfini
10-02-2007, 18:06
Ma quindi, scusa, a che serve questo "doppione" di tipo (visto che dichiaro una struttura di tipo struttura_pippo e immediatamente anche il suo doppione PIPPO)??
Non si faceva "prima" e in maniera più "chiara" a dichiarare direttamente la struttura in un nome o nell' altro evitando il typedef?

Questa cosa non la capisco visto che poi, nei restanti file si utilizza sempre il tipo PIPPO e mai struttura_pippo.

andbin
10-02-2007, 18:21
typedef struct struttura_pippo {
.
.
} PIPPO;

1) Così come è dichiarato il tutto, potresti creare variabili in questo modo:

struct struttura_pippo var1;

o

PIPPO var2;

2) 'struttura_pippo' si può anche omettere, se si vuole usare solo PIPPO:

typedef struct {
.
.
} PIPPO;
(così crei un nuovo tipo PIPPO a partire da una struttura "anonima").

3) Sarebbe la stessa cosa fare:

struct struttura_pippo {
.
.
};
e poi

typedef struct struttura_pippo PIPPO;

oregon
10-02-2007, 18:33
Originariamente inviato da Ol3iconfini
Questa cosa non la capisco visto che poi, nei restanti file si utilizza sempre il tipo PIPPO e mai struttura_pippo.

Se non userai mai

struct struttura_pippo

ma solamente il sinonimo dichiarato (PIPPO) allora puoi scrivere



typedef struct {
.
.
} PIPPO;


(usando la struttura anonima cosi' come indicato da andbin)

Ma e' una tua scelta ... e al compilatore non importa se, al contrario, vuoi comunque dare un nome alla struttura.

Ol3iconfini
10-02-2007, 18:37
Quindi come pensavo, è un "doppione" di tipo...

Come ti dicevo questo codice è in mano mia e lo stavo leggendo per integrarlo, e non riuscivo/riesco a capire quella scelta del "doppione"...

Loading