2011-11-16 29 views
5

Tôi có một cái gì đó như:typedef stuct với tờ khai chuyển tiếp trong C

typedef struct Data DATA, *DATA_PTR; 
typedef struct Units UNITS, *UNITS_PTR; 

struct Data 
{ 
    double miscData; 
    UNITS units; 
}; 

struct Units 
{ 
    double x[2]; 
    double y[2]; 
    double z[2]; 
}; 

trong tập tin project_typedef.h tôi.

Trong tập tin khác, tôi có cái gì đó như:

void fileInput(DATA_PTR data) 
{ 
    //usual declarations and other things 
    data->miscData = 0; //Works! 
    data->units.x[0] = 5; //Doesn't work 
    //etc... 
} 

Tuy nhiên, điều này không làm việc kể từ khi đơn vị được công bố sau khi dữ liệu trong project_typedef.h (nếu tôi chuyển đổi thứ tự nó hoạt động). Lỗi mà tôi nhận được là "left of '.x' phải có struct/union type". Tôi nghĩ rằng tờ khai chuyển tiếp sẽ khắc phục vấn đề này. Tại sao không?

+3

Đầu tiên là == trông lạ ... – Tudor

+0

@Tudor, một lỗi đánh máy, nhưng đó không phải là cách nó nằm trong mã của tôi. Nó đã được chỉnh sửa ngay bây giờ. – user1007692

+3

Tôi chỉ muốn nói rằng tôi ghét khi tôi thấy các loại con trỏ được sử dụng làm loại bình thường. DATA_PTR không đơn giản hóa mã viết bằng bất kỳ cách nào vì nó vẫn là con trỏ và bạn vẫn phải sử dụng toán tử ->. –

Trả lời

10

Khi bạn xác địnhData, tất cả thành viên phải là loại hoàn chỉnh. Kể từ UNITS không phải là một loại hoàn chỉnh tại thời điểm đó, điều này không hoạt động. (Ngược lại, UNITS_PTRsẽ ổn thôi, vì con trỏ đến các loại không đầy đủ là loại hoàn chỉnh.)

một cách đơn giản định nghĩa Units trên định nghĩa Data và bạn cần sử dụng tốt.

(Như @cnicutar đã lưu ý, bạn tôi cũng đang sử dụng mảng x sai.)

5

Tuyên bố chuyển tiếp cho phép bạn sử dụng tên của nó trong ngữ cảnh nơi cho phép loại không đầy đủ. Khai báo một cấu trúc thành viên không phải là một trong những trường hợp như vậy, định nghĩa đầy đủ phải được biết đến vì nó góp phần vào cấu trúc bố trí.

1

Không có nguyên mẫu cho struct. Điều này là do trình biên dịch cần phải biết kích thước của struct trước khi sử dụng nó. Bạn có thể sử dụng con trỏ trên struct, bởi vì con trỏ có kích thước đã biết bất kể chúng trỏ đến loại nào.

0

cho một định nghĩa struct bạn nên luôn luôn sử dụng các loại hoàn chỉnh cho tất cả các thành viên trong một cấu trúc ... nhưng đây không phải là trường hợp với UNITS units trong struct Data, mà tuyên bố một biến tên là units loại struct Units mà không bao giờ được công bố trước khi struct Dữ liệu ... điều này phản ánh lỗi .. bạn nên đặt định nghĩa Units ở trên Data định nghĩa .. và tất cả sẽ hoạt động tốt ..

và liên quan đến việc khai báo này không hoạt động vì bất cứ khi nào biến cấu trúc được xác định, trình biên dịch đầu tiên phân bổ bộ nhớ cần thiết cho cấu trúc (cấu trúc thành viên donot có bộ nhớ được cấp phát cho chúng, trừ khi chúng ar e liên kết với một loại cấu trúc của biến .. đó là lý do tại sao các biến struct không thể được khởi tạo bên trong struct template) .. :)

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