2014-12-15 15 views
8

Tôi sử dụng g ++ để biên dịch mã với các trường được đóng gói. Tuy nhiên, tôi nhận được lỗi khi cố gắng trả lại tham chiếu đến trường được đóng gói.Tại sao tôi không thể trả lại tham chiếu đến trường được đóng gói?

Ví dụ:

struct __attribute__((packed)) Foo { 
    int* ptr; 
    uint16_t foo; 
    int*& getPtr(){ 
     return ptr; 
    } 
}; 

mang lại lỗi:

test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’ 
    return ptr; 

Tại sao tôi không thể trả về một tham chiếu đến một lĩnh vực đóng gói?

+6

Nếu nó được đóng gói, trường có thể không được căn chỉnh đúng cách. –

+0

@ T.C .: Có cách nào để nói với gcc "Liên kết trục vít, tôi trên x86" không? – gexicide

+1

@gexicide 'return (int * &)ptr;' –

Trả lời

2

Có một báo cáo gcc lỗi Cannot bind packed field bao gồm này và nó nói:

The C++ spec (C++03, Sects. 3.9, 3.9.1, 3.9.2) are very clear that T and "pointer to T" have implementation-specific alignment requirements. If you have a "pointer to T" then you may assume that it meets the alignment requirements. I'm sure the C spec has similar language.

In the OP's case, the following code could violate the alignment requirements

Họ đề nghị một workaround sử dụng alignment thuộc tính để xác định loại liên kết riêng của bạn, nhưng nó không giống như nó hoạt động.

+0

Đừng tin điều này, chỉ tìm thấy cùng một báo cáo lỗi và sắp đăng cùng một câu trích dẫn ... – Columbo

+0

Tôi đã thử cách giải quyết với thuộc tính alginment. của tôi gcc – gexicide

+0

@gexicide "workaround" trông giống như một hack mà tránh được thông báo lỗi nhưng không thực sự làm việc. Có 'getPtr' trả về một proxy thay vì –

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