2015-09-18 25 views
5

Attualmente sto imparando sulla struttura dati struct in C e su come è possibile preimpostare questa struttura con la parola chiave typedef. Questo fa sì che i nomi delle variabili della struttura effettiva da collocare in spazi di nomi diversi come spiegato in parecchi riferimenti diversi:struct senza typedef parola chiave

Difference between 'struct' and 'typedef struct' in C++?

typedef struct vs struct definitions

Tuttavia, non è chiaro da quanto accade con l'esempio che sto lavorando con:

#include <stdio.h> 

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

int main() 
{  
    printf("Size of struct: %i\n", sizeof(struct demo)); 
    printf("Size of struct: %i\n", sizeof(synth)); 
    return 0; 
} 

In questo esempio, sono in grado di accedere alla struttura dei dati struct attraverso la variabile synth nome; tuttavia, negli esempi che ho visto, per poter essere in grado di farlo, è necessario specificare struct con typedef. In questo esempio, non viene utilizzato typedef eppure sono ancora in grado di fare riferimento a questa struttura tramite synth. Mi chiedo cosa si stia verificando esattamente che C mi sta permettendo di fare questo? Qualsiasi spiegazione sarebbe apprezzata. Saluti.

+0

Conoscete con cosa 'typedef' fa? – ameyCU

+0

'sizeof' produce un risultato di tipo' size_t'. La stringa di formato corretta per un valore 'size_t' è'% zu', non '% i' (che è per' int'). –

+0

Grazie per l'informazione 'size_t'. Da quello che ho capito, ciò che 'typedef' fa è che crea una variabile in uno spazio dei nomi separato che consente di fare riferimento alla struttura senza bisogno di usare' struct demo'. Non sono sicuro se qualcos'altro sta accadendo dietro le quinte. –

risposta

6
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

è la stessa:

// declare struct demo 
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}; 

// define struct variable synth 
struct demo synth; 

Ora è possibile accedere ai membri struct, ad esempio:

synth.sequential = 1; 

sizeof(struct demo) restituisce la dimensione del struct demo.

sizeof(synth) restituisce la dimensione dell'istanza di calcestruzzo synth.

In questo caso entrambi restituiscono la stessa dimensione.

Aggiornamento:

Utilizzando typedef potrebbe assomigliare a questo:

// declare new type demo 
typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} demo_t; 

// define demo_t variable synth 
demo_t synth; 

Aggiornamento 2:

Dal Linux kernel coding style:

Capitolo 5: Typedef

Si prega di non utilizzare cose come "vps_t". È un errore da utilizzare typedef per strutture e puntatori. Quando vedi

nella fonte, cosa vuol dire? Al contrario, se si dice

struct virtual_container *a; 

si può effettivamente dire che cosa "a" è.

0

Questo è lo stesso come se hai dichiarato:

int i; 

E ha fatto questo:

printf("Size of int: %i\n", sizeof(int)); 
printf("Size of int: %i\n", sizeof(i)); 

Le due linee avrebbero stampare lo stesso valore.

Se trovassi questo:

typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} mydemo; 

mydemo synth; 

Si potrebbe fare questo:

printf("Size of struct: %i\n", sizeof(struct demo)); 
printf("Size of struct: %i\n", sizeof(mydemo)); 
printf("Size of struct: %i\n", sizeof(synth)); 

e avrebbero anche stampare la stessa cosa.

0

Sono in grado di accedere allo struct data structure tramite il nome della variabile synth; tuttavia, negli esempi che ho visto, per poter essere in grado di farlo, è necessario specificare struct con typedef.

No, non è quello che pensi. Non è a causa di typedef è possibile accedere ai membri struct con synth.

In questo esempio, typedef non viene utilizzato e tuttavia sono ancora in grado di fare riferimento a questa struttura attraverso synth.

È a causa di synth per sé in quanto è struct variable che si può accedere ai membri di struct.

typedef è una parola chiave utilizzata in linguaggio C per assegnare nomi alternativi a tipi esistenti. Principalmente per tipi di dati definiti dall'utente.

Un esempio -

typedef struct A{ 
    char B; 
    int C; 
}D ; 

Qui ora, D può essere utilizzato per dichiarare variabili struct.

Senza typedef -

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}synth; 

synth è una variabile struct ed è possibile accedere ai membri di struct. Ma in questo senza typedef se volete dichiarare variabile struct si deve dichiarare come questo -

struct demo t; 

In entrambi casi, se si rimuove anche typedef poi anche si può accedere struct con synth, typedef ha alcun ruolo nella quella.

2

La parola chiave typedef non è necessaria per i tipi C struct. L'unico vantaggio che ti dà è che crea un nome di una sola parola per il tipo.

La dichiarazione nel tuo esempio:

struct demo 
{ 
    /* ... */ 
} synth; 

è in realtà due dichiarazioni, uno per il tipo struct demo, e uno per un oggetto di quel tipo di nome synth. È forse più chiaramente scritto come due dichiarazioni separate:

struct demo 
{ 
    /* ... */ 
}; 

struct demo synth; 

La prima dichiarazione crea un nuovo tipo di struttura. Il suo nome è struct demo. Il secondo definisce un oggetto di quel tipo, chiamato synth.

L'identificatore demo di per sé, date queste dichiarazioni, non ha senso; è un tag della struttura ed è significativo solo se preceduto dalla parola chiave struct.

synth, d'altra parte, è il nome di un oggetto (variabile) . Non ha bisogno di essere, e di fatto non può essere, preceduto dalla parola chiave struct.

È possibile, se si preferisce, aggiungere typedef per assegnare al tipo struct demo un secondo nome. (A typedef non definisce un nuovo tipo; si limita a definire un nuovo nome, un alias, per un tipo esistente.) Ad esempio, un idioma comune è:

typedef struct demo { 
    /* ... */ 
} demo; 

Come la tua dichiarazione originale, questo è davvero a due dichiarazioni, una definizione struct che crea il tipo struct demo e un typedef che crea un nuovo nome demo per quel tipo. Potrebbe essere scritto come:

struct demo { 
    /* ... */ 
}; 
typedef struct demo demo; 

seguito, se si vuole, da una dichiarazione oggetto:

demo synth; 

(Si noti che non c'è bisogno per il tag struct e il nome typedef essere distinti, e IMHO è più chiaro per loro di essere lo stesso.)

La scelta se utilizzare typedef per i tipi di struttura è principalmente uno di stile. La mia preferenza personale è non per utilizzare typedef per le strutture; struct demo ha già un nome perfettamente buono. Ma molti programmatori preferiscono avere un nome che sia un singolo identificatore.

+0

@JensGustedt: risolto, grazie! –

0

Il typedef Parola chiave: C'è un modo più semplice per definire le strutture oppure è possibile "alias" i tipi creati. Per esempio:

typedef struct 
{ 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
}Books; 

Ora, è possibile utilizzare libri direttamente per definire le variabili di tipo libri senza usare struct parola chiave.Di seguito è riportato l'esempio:

Books Book1, Book2; 

È possibile utilizzare typedef parola chiave per i non le strutture così come segue:

typedef long int *pint32; 

pint32 x, y, z; 

x, yez sono tutti i puntatori a lunghe interi