2015-09-18 23 views
5

Tôi hiện đang tìm hiểu về cấu trúc dữ liệu struct trong C và cách có thể bắt đầu cấu trúc này bằng từ khóa typedef. Điều này làm cho tên biến của cấu trúc thực được đặt trong không gian tên khác nhau như được giải thích trong tài liệu tham khảo khác nhau:struct mà không có từ khóa typedef

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

typedef struct vs struct definitions

Tuy nhiên, nó không rõ ràng như những gì đang xảy ra với ví dụ mà tôi đang làm việc với:

#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; 
} 

Trong ví dụ này, tôi có thể truy cập vào cấu trúc struct dữ liệu thông qua các biến synth Tên; tuy nhiên, trong các ví dụ mà tôi đã thấy, để tôi có thể thực hiện điều này, struct cần được bắt đầu bằng typedef. Trong ví dụ này, typedef không được sử dụng nhưng tôi vẫn có thể tham chiếu cấu trúc này thông qua synth. Tôi tự hỏi chính xác những gì đang xảy ra mà C là cho phép tôi làm điều này? Mọi lời giải thích sẽ được đánh giá cao. Chúc mừng.

+0

Bạn có quen thuộc với những gì 'typedef' làm gì? – ameyCU

+0

'sizeof' mang lại kết quả của loại' size_t'. Chuỗi định dạng đúng cho giá trị 'size_t' là'% zu', không phải '% i' (là' int'). –

+0

Cảm ơn thông tin 'size_t'. Từ những gì tôi hiểu, những gì 'typedef' làm là nó tạo ra một biến trong một không gian tên riêng biệt cho phép cấu trúc được tham chiếu mà không cần sử dụng' struct demo'. Không chắc chắn nếu bất cứ điều gì khác đang xảy ra đằng sau hậu trường. –

Trả lời

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

là giống như:

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

// define struct variable synth 
struct demo synth; 

Bây giờ bạn có thể truy cập các thành viên struct, ví dụ:

synth.sequential = 1; 

sizeof(struct demo) trả về kích thước của struct demo.

sizeof(synth) trả về kích thước của ví dụ cụ thể synth.

Trong trường hợp này cả hai đều trả về cùng một kích thước.

Cập nhật:

Sử dụng typedef nó có thể trông như thế này:

// 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; 

Cập nhật 2:

Từ Linux kernel coding style:

Chương 5: Typedefs

Vui lòng không sử dụng những thứ như "vps_t". Đó là lỗi để sử dụng typedef cho cấu trúc và con trỏ. Khi bạn thấy số điện thoại

vps_t a; 

trong nguồn, ý nghĩa của nó là gì? Ngược lại, nếu nó cho biết

bạn thực sự có thể biết "a" là gì.

0

này cũng giống như nếu bạn tuyên bố:

int i; 

Và đã làm điều này:

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

Hai dòng sẽ in ra giá trị như nhau.

Nếu bạn có điều này:

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

mydemo synth; 

Bạn có thể làm điều này:

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)); 

Và họ cũng sẽ in ra điều tương tự.

0

Tôi có thể truy cập struct data structure thông qua tên biến số synth; tuy nhiên, trong các ví dụ mà tôi đã thấy, để tôi có thể thực hiện điều này, struct cần được bắt đầu bằng typedef.

Không, đó không phải là những gì bạn nghĩ. Không phải vì typedef bạn có thể truy cập cấu trúc thành viên bằng synth.

Trong ví dụ này, typedef không được sử dụng nhưng tôi vẫn có thể tham chiếu cấu trúc này qua synth.

Đó là vì synth chính nó vì nó là struct variable mà bạn có thể truy cập các thành viên của cấu trúc.

typedef là từ khóa được sử dụng bằng ngôn ngữ C để chỉ định tên thay thế cho các loại hiện có. Chủ yếu cho các loại dữ liệu do người dùng xác định.

Một ví dụ -

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

Ở đây bây giờ, D có thể được sử dụng để khai báo biến struct.

Without typedef -

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

synth là một biến struct và bạn có thể truy cập các thành viên của struct. Nhưng trong này mà không typedef nếu bạn muốn khai báo biến struct bạn phải khai báo như thế này -

struct demo t; 

Trong cả hai trường hợp nếu bạn thậm chí loại bỏ typedef sau đó bạn cũng có thể truy cập struct với synth, typedef không có vai trò trong cái đó.

2

Từ khóa typedef không cần thiết cho các loại C struct. Ưu điểm duy nhất nó mang lại cho bạn là nó tạo ra một tên một từ cho loại đó.

Việc kê khai trong ví dụ của bạn:

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

thực sự là hai tờ khai, một cho các loại struct demo, và một cho một đối tượng của loại hình đó đặt tên synth. Nó có lẽ được viết rõ ràng hơn dưới dạng hai tờ khai riêng biệt:

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

struct demo synth; 

Khai báo đầu tiên tạo ra một loại cấu trúc mới. Tên của nó là struct demo. Thứ hai định nghĩa một đối tượng thuộc loại đó, có tên là synth.

Mã định danh demo của chính nó, với các khai báo này, là vô nghĩa; đó là một thẻ cấu trúc và chỉ có ý nghĩa khi đứng trước từ khóa struct. Mặt khác,

synth là tên của đối tượng (biến). Nó không cần phải, và trên thực tế không thể, trước bởi từ khóa struct.

Bạn có thể, nếu muốn, hãy thêm typedef để cung cấp cho loại struct demo tên thứ hai. (A typedef không định nghĩa một kiểu mới, nó chỉ đơn thuần là định nghĩa một tên mới, một bí danh, cho một loại hiện có.) Ví dụ, một thành ngữ phổ biến là:

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

Giống như tuyên bố ban đầu của bạn, điều này thực sự là hai khai báo, định nghĩa struct tạo kiểu struct demotypedef tạo tên mới demo cho loại đó. Nó có thể được viết như sau:

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

sau đó, nếu bạn thích, bởi một tuyên bố đối tượng:

demo synth; 

(Lưu ý rằng không có nhu cầu sử dụng thẻ struct và tên typedef là riêng biệt, và IMHO rõ ràng hơn cho chúng giống nhau.)

Việc chọn sử dụng typedef đối với các kiểu cấu trúc chủ yếu là một trong các kiểu. Sở thích cá nhân của tôi là không phải để sử dụng typedef cho cấu trúc; struct demo đã có một cái tên hoàn hảo. Nhưng rất nhiều lập trình viên thích có một tên duy nhất.

+0

@JensGustedt: Đã sửa lỗi! –

0

Từ khóa typedef: Có cách dễ dàng hơn để xác định cấu trúc hoặc bạn có thể tạo các loại "bí danh". Ví dụ:

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

Bây giờ, bạn có thể sử dụng Sách trực tiếp để xác định các biến loại Sách mà không sử dụng từ khóa struct.Sau đây là ví dụ:

Books Book1, Book2; 

Bạn có thể sử dụng từ khoá typedef cho phi cấu trúc cũng như sau:

typedef long int *pint32; 

pint32 x, y, z; 

x, y, z là tất cả các con trỏ tới ints dài

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