2010-11-02 2 views
8

Attualmente sto usando un IDE C++ per qualcosa che dovrà lavorare su C, e volevo assicurarmi che non avrò problemi con questo in seguito. Dopo aver effettuato la struct di seguito:struct e typedef in C contro C++

typedef struct test { 
    int a; 
    int b; 
}; 

Ho quindi creare un'istanza di esso utilizzando test my_test; quindi roba come my_test.a = 5, ecc ... e questo funziona bene nel mio VStudio C++. In seguito funzionerà su gcc?

Ho letto le domande correlate che sono saltate fuori (vedo che non sono la prima persona con questo tipo di domande), ma nessuno sembrava usare il mio modo di fare.

In effetti, qual è la differenza tra typedef struct {//stuff} test; e la mia versione?

+0

È possibile compilare il programma aprendo il prompt dei comandi e digitando: 'gcc FilePath/foo.c'. –

+2

Possibile duplicato di [typedef struct vs struct definition] (http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions) Ho scritto una risposta esauriente sulle differenze e sul significato concreto e reale di ciascuna di questi due costrutti in C e C++ come risposta alla domanda collegata. Leggilo per i dettagli non disponibili nella risposta accettata. –

risposta

18

La differenza tra:

struct Name {}; 

E

typedef struct Name {} Name; 

è che, in C, è necessario utilizzare:

struct Name instance_name; 

Con il primo, mentre con il secondo voi può fare:

Name instance_name; 

In C++, non è necessario ripetere la parola chiave struct in entrambi i casi. Si noti che l'esempio in cui si crea un typedef senza nome (ad esempio typedef struct Name{};) è AFAIK non standard (se si utilizza la parola chiave typedef, è necessario fornire un alias a cui digitare typedef tale nome).

Per quanto riguarda l'ultima variazione:

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

Il codice di cui sopra crea una struct senza nome che è alias a Nome. Useresti una tale struttura nello stesso modo in cui faresti con typedef struct Name { /* ... */ } Name;, tuttavia i compilatori spesso emettono il nome della struct (non l'alias), e quindi potresti ottenere migliori messaggi di errore che coinvolgono la struct se gli dai un nome e un typedef che al contrario di typedef'ing una struttura anonima.

+0

Ho appena notato che "Warning 'typedef': ignorato alla sinistra di 'test' quando non viene dichiarata alcuna variabile" è ciò che ottengo quando faccio le cose nel modo in cui ho scritto nel mio snippet di codice originale. Il che solleva la domanda: cosa fa anche la cosa che ho scritto? – user472875

+0

@ user472875: niente. È come scrivere "typedef int". O come scrivere una definizione in un dizionario senza dare la parola che significa quella cosa. –

18
typedef struct THIS_IS_A_TAG 
{ 
    int a; 
    int b; 
} THIS_IS_A_TYPEDEF; 

THIS_IS_A_TYPEDEF object1;  // declare an object.  C:Ok,  C++:Ok 
struct THIS_IS_A_TAG object2; // declare another object. C:Ok,  C++:Ok 
THIS_IS_A_TAG object3;   // declare another object. C:Not Ok, C++:Ok 

Il motivo per il typedef è perché i programmatori C vorrebbero essere in grado di farlo terza cosa, ma non possono.

7

sia in C e C++, l'esempio costrutto è modestamente inutile:

typedef struct test { 
    int a; 
    int b; 
}; 

In C, questo dice che c'è un tipo struct test con i due interi come contenuto. Se ci fosse un nome tra la chiusura parentesi graffa '}' e il punto e virgola ';', allora si dovrebbe ottenere qualche beneficio dalla parola chiave typedef; allo stato attuale, la parola chiave typedef è ridondante e (se impostato abbastanza preciso), GCC ti avviserà a riguardo.

In C++, questo dice che c'è un tipo struct test; inoltre, in C++, crea anche un tipo test (cosa che non succede in C).La parola chiave typedef può ancora essere lasciata fuori e lo stesso risultato sarà raggiunto.

La sintassi è legale; non è utile, questo è tutto. La parola chiave typedef può essere omessa senza modificare il significato del programma nel minimo.

si può fare:

typedef struct test { 
    int a; 
    int b; 
} test; 

Ora, sia in C e C++, è necessario un tipo di struct test e un alias per esso test.