I use g++ to compile code with packed fields. However, I receive an error when trying to return a reference to a packed field.
Example:
struct __attribute__((packed)) Foo {
int* ptr;
uint16_t foo;
int*& getPtr(){
return ptr;
}
};
yields error:
test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’
return ptr;
Why can't I return a reference to a packed field?
There is a gcc bug report Cannot bind packed field that covers this and it says:
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
They suggest a workaround using alignment
attribute to define your own aligned type but it does not look like it works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With