2012-02-04 31 views
14

struct Anonymous đã được thêm vào trong các tiêu chuẩn C11, vì vậyC11 cấu trúc ẩn danh thông qua typedefs?

typedef struct { 
    struct {int a, b}; 
    int c; 
} abc_struct; 

là hợp lệ và tiêu chuẩn. Là nó cũng trong tiêu chuẩn để sử dụng một typedef tại chỗ của tuyên bố cấu trúc đầy đủ? Ví dụ .:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 

Các tài liệu GCC nói rằng đây là một phần mở rộng Plan 9, nhưng sau đó nó hoạt động trong vài trình biên dịch Tôi đã thử (bao gồm GCC ...). Bằng cách đọc bản thân tiêu chuẩn của tôi, Tôi nghĩ rằng đó là OK, nhưng đây là loại đọc gần đó là dễ dàng để vít lên.

Trả lời

9

Điều này dường như đã được Joseph S. Myers trong nhóm gcc hỏi rõ ràng. Và câu trả lời là không, nó không hợp lệ trong C11.

Xem câu trả lời ở đây:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

Và comment Myers của:

họp London WG14 của tuần này đã đồng ý để không cho phép việc sử dụng typedefs trong việc công bố cấu trúc và công đoàn vô danh lĩnh vực, theo N1549.

nguồn http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

Câu hỏi đã được hỏi trong SC22WG15.12205 thấy 5,28 SC22WG14.12205, Anonymous Structures (N1425) trong http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

0

Vâng, tôi sợ tôi đã không làm phiền để có được những tiêu chuẩn hoàn thành, nhưng đây là những gì bản thảo cuối cùng nói:

  • Một thành viên giấu tên mà specifier loại là một specifier cấu trúc với không có thẻ là được gọi là cấu trúc ẩn danh; một thành viên chưa được đặt tên có trình chỉ định kiểu là một trình chỉ định công đoàn không có thẻ được gọi là một liên minh ẩn danh.

Tôi chỉ có thể giải thích rằng chỉ struct {};union {}; mới có thể là cấu trúc/liên kết ẩn danh.

4

Thực ra đoạn thứ hai của bạn là đầy nguy hiểm và không phải là tương đương với cái đầu tiên mà không chỉ định rõ ràng -fplan9-extensions trong gcc.

Cụ thể ab_struct; tuyên bố trên dòng 6 KHÔNG NOTHING (theo cảnh báo gcc). Chỉ cần dán đoạn thứ hai của bạn trong foo.c tạo:

foo.c:6: warning: declaration does not declare anything 

Và đặc biệt nếu bạn đã thử:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
} 

bạn sẽ nhận được một lỗi cú pháp trên đường dây 13 abc.a = 5; mà không -fplan9-extensio.

trong khi sử dụng đoạn trên cùng, cấu trúc ẩn danh của bạn sẽ hoạt động như bạn nghĩ.Cụ thể:

typedef struct { 
    struct { 
      int a, b; 
    }; 
     int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
} 
Các vấn đề liên quan