Là một phần của việc trả lời một câu hỏi khác, tôi đã xem một đoạn mã như thế này, mà gcc biên dịch mà không có khiếu nại.Làm cách nào để hợp pháp tham chiếu một loại không xác định bên trong một cấu trúc?
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
Đây là phương tiện Tôi luôn sử dụng để xây dựng các loại trỏ đến bản thân (ví dụ, danh sách liên kết) nhưng tôi đã luôn luôn nghĩ rằng bạn phải tên struct, do đó bạn có thể sử dụng tự tham khảo . Nói cách khác, bạn không thể sử dụng xyz *z
trong cấu trúc vì typedef chưa hoàn thành tại thời điểm đó.
Nhưng mẫu cụ thể này không không phải là đặt tên cấu trúc và nó vẫn biên dịch. Tôi nghĩ ban đầu có một số ma thuật đen đang diễn ra trong trình biên dịch tự động dịch mã trên bởi vì cấu trúc và tên typedef giống nhau.
Nhưng vẻ đẹp chút này làm việc cũng như:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
tôi thiếu gì ở đây? Điều này có vẻ vi phạm rõ ràng vì không có loại struct NOTHING_LIKE_xyz
được xác định ở bất kỳ đâu.
Khi tôi thay đổi nó từ một con trỏ tới một kiểu thực tế, tôi nhận được lỗi dự kiến:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
Ngoài ra, khi tôi loại bỏ các struct
, tôi nhận được một lỗi (parse error before "NOTHING ...
).
Điều này có được phép trong ISO C không?
Cập nhật: Một struct NOSUCHTYPE *variable;
cũng biên dịch vì vậy nó không chỉ bên cấu trúc nơi nó có vẻ là hợp lệ. Tôi không thể tìm thấy bất cứ điều gì trong tiêu chuẩn c99 cho phép khoan dung này cho con trỏ cấu trúc.
Khối mã thứ hai và thứ ba giống hệt nhau. – badp
Rất tiếc, đã khắc phục điều đó. Lỗi người dùng Cut'n'paste. – paxdiablo
+1, Câu hỏi đó khiến nhiều người gãi đầu (bao gồm tôi). –