2011-12-26 39 views
5

Hôm nay tôi bắt đầu làm việc trên mã FUSE mã nguồn mở, có tôi tìm thấy vài dòng như thế này:Cách diễn giải cấu trúc không có định nghĩa?

struct fuse_session; 
struct fuse_chan; 

Tôi không biết làm thế nào để giải thích nó, theo như tôi biết 'struct' Tiếp theo là tên cấu trúc và sau đó là tên biến. Trường hợp như trong trường hợp này chỉ có một thực thể được đặt tên theo sau là struct, vì vậy phiên cầu chì này là biến cấu trúc hoặc tên cấu trúc. Đó có thể là một số điều cơ bản nhưng tôi không thể tìm thấy nó ở bất cứ đâu.

Trả lời

9

này thường được sử dụng cho một trong các cách sau:

  1. Bạn muốn cho phép người dùng của một số mô-đun để biết rằng struct này tồn tại, nhưng không muốn để lộ nội dung của nó. Ví dụ:

    trong api.h:

    struct bar; 
    
    void GetStruct(struct bar *); 
    void SetActive(struct bar *, char); 
    

    trong tập tin nội bộ của bạn:

    struct bar { 
        char is_active; 
    }; 
    
    void GetStruct(struct bar * st) { 
        st = malloc(sizeof(struct bar)); 
    } 
    
    void SetActive(struct bar * st, char active) { 
        if (st != NULL) 
         st->is_active = active; 
    } 
    

    Bằng cách này bạn đóng gói thực hiện và có thể thay đổi các cấu trúc sau này nếu cần thiết mà không cần bất kỳ tác động trên sử dụng mô-đun.

  2. Bạn muốn sử dụng cấu trúc (con trỏ) trước khi khai báo. Ví dụ:

    struct bar; 
    typedef int (*FooFuncType)(struct bar *); 
    struct bar { 
        FooFuncType a_func;   
    }; 
    

Một lưu ý quan trọng:

Nếu bạn chỉ có khai báo struct, như trong câu hỏi của bạn, bạn có thể không đề cập đến các cấu trúc trực tiếp, cũng không phải bạn có thể sử dụng toán tử sizeof, chỉ khai báo một con trỏ đến cấu trúc.

+0

@Binyanmin cảm ơn vì đã đưa ra giải thích minh họa .. –

+2

@ user1115935, điều này còn được gọi là khai báo chuyển tiếp. –

0

tôi đã tìm thấy những thứ như vậy trong số một số tệp tiêu đề API được cung cấp của thư viện. Một số thư viện không muốn để lộ các chi tiết thành viên của một số cấu trúc được sử dụng trong thư viện nhưng họ inten để ứng dụng có thể sử dụng những cấu trúc như con trỏ trong trường hợp đó ...

0

Đó là loại không đầy đủ hoặc loại đục, và chúng hữu ích khi giao diện thư viện chỉ hoạt động với con trỏ đến các loại đó. Bạn không cần phải điền vào tất cả các chi tiết của những gì có trong các cấu trúc để không có mã bên ngoài thư viện có thể truy cập dữ liệu trong cấu trúc (hợp pháp). Mã bên trong thư viện có một tiêu đề riêng cung cấp các chi tiết về những gì có trong các cấu trúc, do đó thư viện thực sự có thể làm việc với các nội dung, nhưng đó là một chi tiết ẩn từ người tiêu dùng của thư viện.

Các loại không đầy đủ cung cấp sự an toàn loại tốt hơn nhiều so với một giải pháp thay thế đôi khi được sử dụng, cụ thể là con trỏ void. Quá dễ nhầm lẫn khi có nhiều loại khác nhau được biểu thị bằng 'void *'. Với các loại không đầy đủ, bạn có thể phân biệt đúng các loại khác nhau, nhưng vẫn không tiết lộ chi tiết về cách chúng được triển khai.

2

Bạn sẽ nhận được phần giới thiệu về forward declaration trong C. Vui lòng thử liên kết this.

0

Forward Declaration điều này giúp trình biên dịch giải quyết các tham chiếu cấu trúc từ các phần khác nhau của chương trình.

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