2014-12-15 18 views
8

Paketlenmiş alanlarla kod derlemek için g ++ kullanıyorum. Ancak, dolu bir alana bir başvuru göndermeye çalışırken bir hata alıyorum.Neden dolu bir alana bir başvuru döndüremiyorum?

Örnek:

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

hata verir:

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

Neden paketlenmiş alan başvuru döndüremez?

+6

Paketlenmişse, alan düzgün şekilde hizalanmamış olabilir. –

+0

@ T.C .: gcc "Vida hizalama, x86 üzerindeyim" demenin bir yolu var mı? – gexicide

+1

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

cevap

2

Orada bu kapsayan bir gcc hata raporu Cannot bind packed field ve şöyle der:

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

Onlar kendi hizalanmış tipini tanımlamak için alignment özelliğini kullanarak geçici bir çözüm önermek ama işe yarıyor gibi görünmüyor.

+0

Sadece aynı hata raporunu buldu ve aynı alıntıyı göndermek üzereydi ... – Columbo

+0

Alginment özniteliğiyle geçici çözüm denedim. benim gcc. – gexicide

+0

@gexicide "Geçici çözüm" hata mesajını önleyen ancak aslında çalışmıyor bir hack gibi görünüyor. 'getPtr' yerine bir proxy döndürün. –

İlgili konular