Περισσότερα
Διαφορά μεταξύ 'struct' και 'typedef struct' στη C++;
Στη C++, υπάρχει κάποια διαφορά μεταξύ:
struct Foo { ... };
και
typedef struct { ... } Foo;
796
3
Στη C++, υπάρχει μόνο μια λεπτή διαφορά. Είναι ένα κατάλοιπο από τη C, στην οποία έχει διαφορά.
Το πρότυπο της γλώσσας C (C89 §3.1.2.3, C99 §6.2.3, και C11 §6.2.3) επιβάλλει ξεχωριστά namespaces για διαφορετικές κατηγορίες αναγνωριστικών, συμπεριλαμβανομένων των tag identifiers (για
struct
/union
/enum
) και των ordinary identifiers (γιαtypedef
και άλλα αναγνωριστικά).Αν απλά είπατε: "Τα αναγνωριστικά είναι τα αναγνωριστικά που χρησιμοποιούνται για την περιγραφή των αναγνωριστικών...":
θα παίρνατε ένα σφάλμα μεταγλωττιστή, επειδή το
Foo
ορίζεται μόνο στο χώρο ονομάτων της ετικέτας.Θα πρέπει να το δηλώσετε ως:
Κάθε φορά που θέλετε να αναφερθείτε σε ένα
Foo
, θα πρέπει πάντα να το ονομάζετεδομή Foo
. Αυτό γίνεται γρήγορα ενοχλητικό, οπότε μπορείτε να προσθέσετε έναtypedef
:Τώρα το
struct Foo
(στο χώρο ονομάτων ετικετών) και το απλόFoo
(στο συνηθισμένο χώρο ονομάτων αναγνωριστικών) αναφέρονται και οι δύο στο ίδιο πράγμα, και μπορείτε να δηλώσετε ελεύθερα αντικείμενα τύπουFoo
χωρίς τη λέξη κλειδίstruct
.Η κατασκευή:
είναι απλώς μια συντομογραφία για τη δήλωση και το
typedef
.Τέλος,
δηλώνει μια ανώνυμη δομή και δημιουργεί μια
typedef
για αυτήν. Έτσι, με αυτή την κατασκευή, δεν έχει όνομα στο χώρο ονομάτων tag, παρά μόνο ένα όνομα στο χώρο ονομάτων typedef. Αυτό σημαίνει ότι δεν μπορεί επίσης να δηλωθεί προς τα εμπρός. Αν θέλετε να κάνετε μια δήλωση προς τα εμπρός, πρέπει να της δώσετε ένα όνομα στο χώρο ονομάτων tag.Στη C++, όλες οι δηλώσεις
struct
/union
/enum
/class
συμπεριφέρονται σαν να είναι εμμέσωςtypedef
'ed, εφόσον το όνομα δεν κρύβεται από άλλη δήλωση με το ίδιο όνομα. Δείτε την απάντηση του Michael Burr's για όλες τις λεπτομέρειες.Υπάρχει υπάρχει διαφορά, αλλά είναι λεπτή. Δείτε το ως εξής: η δομή Foo εισάγει έναν νέο τύπο. Η δεύτερη δημιουργεί ένα ψευδώνυμο που ονομάζεται Foo (και όχι έναν νέο τύπο) για έναν ανώνυμο τύπο
struct
.Έτσι, ένα typedef πάντα χρησιμοποιείται ως placeholder/συνώνυμο για έναν άλλο τύπο.
Δεν υπάρχει διαφορά στη C++, αλλά πιστεύω ότι στη C θα σας επέτρεπε να δηλώσετε περιπτώσεις της δομής Foo χωρίς να το κάνετε ρητά: