2014-11-03 62 views
5

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 

}; 

typedef struct{ 

      //Some fields 

} square; 
+0

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

+0

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

Trả lời

10

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.

+3

Ngoài ra, trong trường hợp đầu tiên 'typedef' là thừa và không làm gì cả. – HolyBlackCat

+0

@HolyBlackCat: Tôi hoàn toàn bỏ lỡ điều đó. Cảm ơn. –

+0

Cảm ơn bạn! Thực sự đã giúp! – PlayHardGoPro

2
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 :)

Các vấn đề liên quan