2014-12-15 8 views
8

Używam g ++ do kompilowania kodu z wypełnionymi polami. Jednak pojawia się błąd podczas próby zwrócenia odwołania do spakowanego pola.Dlaczego nie mogę zwrócić odniesienia do spakowanego pola?

Przykład:

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

daje błąd:

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

Dlaczego nie mogę wrócić odniesienie do pola pakowane?

+6

Jeśli jest zapakowany, pole może nie być prawidłowo wyrównane. –

+0

@ T.C .: Czy istnieje sposób, aby powiedzieć gcc "Wyrównanie śrub, jestem na x86"? – gexicide

+1

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

Odpowiedz

2

Jest raport gcc bug Cannot bind packed field że obejmuje to i mówi:

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

Sugerują one obejście przy użyciu atrybutu alignment zdefiniować własny typ wyrównany, ale to nie wygląda jak to działa.

+0

Nie wierz w to, po prostu znalazłem ten sam raport o błędzie i miałem zamiar opublikować dokładnie ten sam cytat ... – Columbo

+0

Próbowałem obejścia z atrybutem alginment. Jest to po prostu ignorowane przez mój gcc. – gexicide

+0

@gexicide "Obejście problemu" wygląda jak włamanie, które omija komunikat o błędzie, ale tak naprawdę nie działa. "GetPtr" zwraca zamiast tego serwer proxy: –

Powiązane problemy