sự khác biệt giữa hai tờ khai này trong C là gì:Sự khác nhau giữa `typedef struct X {}` và `typedef struct {} X` là gì?
typedef struct square{
//Some fields
};
và
typedef struct{
//Some fields
} square;
sự khác biệt giữa hai tờ khai này trong C là gì:Sự khác nhau giữa `typedef struct X {}` và `typedef struct {} X` là gì?
typedef struct square{
//Some fields
};
và
typedef struct{
//Some fields
} square;
Việc kê khai đầu tiên:
typedef struct square {
// Some fields
};
định nghĩa một loại tên struct square
. Từ khóa typedef
là không cần thiết (nhờ có HolyBlackCat để chỉ ra điều đó). Nó tương đương với:
struct square {
//Some fields
};
(Thực tế là bạn có thể sử dụng từ khóa typedef
trong một tuyên bố mà không xác định một loại tên là một trục trặc trong cú pháp của C).
khai đầu tiên này có lẽ nên đã :
typedef struct square {
// Some fields
} square;
Việc kê khai thứ hai:
typedef struct {
// Some fields
} square;
xác định loại struct
ẩn danh và sau đó đặt cho nó bí danh square
.
Hãy nhớ rằng typedef
không tự xác định loại mới, chỉ tên mới cho loại hiện có. Trong trường hợp này, typedef
và định nghĩa struct
(ẩn danh) xảy ra được kết hợp thành một tuyên bố duy nhất.
Ngoài ra, trong trường hợp đầu tiên 'typedef' là thừa và không làm gì cả. – HolyBlackCat
@HolyBlackCat: Tôi hoàn toàn bỏ lỡ điều đó. Cảm ơn. –
Cảm ơn bạn! Thực sự đã giúp! – PlayHardGoPro
struct X { /* ... */ };
Điều đó tạo Loại mới. Vì vậy, bạn có thể khai báo kiểu mới này bằng cách
struct X myvar = {...}
hoặc
struct X *myvar = malloc(sizeof *myvar);
typdef được thiết kế để đặt tên cho một loại
typedef enum { false, true } boolean;
boolean b = true; /* Yeah, C ANSI doesn't provide false/true keyword */
Vì vậy, ở đây, bạn đổi tên enum để boolean.
Vì vậy, khi bạn viết
typedef struct X {
//some field
} X;
Bạn đổi tên kiểu struct X để X. Khi tôi nói đổi tên, đó là hơn một cái tên khác.
Mẹo, bạn chỉ có thể viết:
typedef struct {
//some field
} X;
Nhưng nếu bạn cần một lĩnh vực với cùng một loại (như trong một danh sách liên kết), bạn phải đặt tên cho struct của bạn
typedef struct X {
X *next; /* will not work */
struct X *next; /* ok */
} X;
Hy vọng điều này sẽ giúp :)
Chỉnh sửa: Như Keith Thompson đã nói, typdef được thiết kế để tạo bí danh :)
Tôi biết, tôi có một số lĩnh vực trong cấu trúc của tôi, tôi chỉ cần biết sự khác biệt của tên trên dưới cùng và trên cùng của cấu trúc ... – PlayHardGoPro
Có thể trùng lặp của [Tại sao chúng ta nên gõ một cấu trúc thường xuyên trong C?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – Raedwald