Я использую g ++ для компиляции кода с упакованными полями. Тем не менее я получаю сообщение об ошибке при попытке вернуть ссылку на упакованное поле.
Пример:
struct __attribute__((packed)) Foo {
int* ptr;
uint16_t foo;
int*& getPtr(){
return ptr;
}
};
выдает ошибку:
test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’
return ptr;
Почему я не могу вернуть ссылку на упакованное поле?
Есть отчет об ошибке gcc Невозможно связать упакованное поле это охватывает это и говорит:
Спецификация C ++ (C ++ 03, разделы 3.9, 3.9.1, 3.9.2) очень ясно показывает, что T и «указатель на T» имеют специфические для реализации требования выравнивания. Если у вас есть «указатель на T», то вы можете предположить, что он соответствует требованиям выравнивания. Я уверен, что спецификация C имеет похожий язык.
В случае OP следующий код может нарушать требования выравнивания
Они предлагают обходной путь, используя alignment
атрибут, чтобы определить свой собственный выровненный тип, но он не выглядит, как работает.