2016-10-26 44 views
5

Giả sử tôi có u nghiệp đoàn với hai thành viên ab cùng loại (ví dụ: int).Các thành viên của cùng một loại

union u{ 
    int a,b; 
    char c; 
}; 

Nếu tôi viết thư cho a, vượt qua nó để một hàm theo giá trị, và các chức năng đọc từ b, mong đợi để nhận được giá trị a, sẽ có bất kỳ vấn đề, xem xét ab có cùng loại? Các thành viên đọc cần phải phản ánh thành viên viết chính xác?

+3

C11 dự thảo N1548 có thể nói rằng sẽ không có vấn đề gì. Tôi không thể chắc chắn. Vẫn đang đọc. Chú thích: “95) Nếu thành viên được sử dụng để đọc nội dung của đối tượng công đoàn không giống như thành viên được sử dụng lần cuối để lưu trữ giá trị trong đối tượng, phần thích hợp của biểu diễn đối tượng của giá trị được diễn giải lại một đại diện đối tượng trong kiểu mới như được mô tả trong 6.2.6 (một quá trình đôi khi được gọi là '' loại punning ''). Đây có thể là một đại diện bẫy. ” – Ryan

Trả lời

4

Vâng, được rồi.

Tiêu chuẩn (C11 dự thảo) nói:

[...] nếu một liên minh chứa một số cấu trúc có chung một chung ban đầu chuỗi (xem dưới đây), và nếu đối tượng đoàn hiện có chứa một trong những cấu trúc, nó được phép kiểm tra phần ban đầu thường gặp của bất kỳ của họ bất cứ nơi nào mà một tuyên bố của các loại hoàn thành của công đoàn là nhìn thấy

đây là hai số nguyên có thể được coi là (rất sim ple) các cấu trúc có cùng trình tự ban đầu.

Thậm chí bỏ qua đó, có thêm:

Nếu thành viên sử dụng để đọc các nội dung của một đối tượng công đoàn không phải là cùng một là thành viên cuối cùng dùng để lưu trữ một giá trị trong đối tượng, phù hợp một phần của đại diện đối tượng của giá trị được giải thích lại như một đại diện đối tượng trong các loại hình mới

reinterpreting một int như một int là khá an toàn. :)

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