Атрибут упакован с C ++ и clang - PullRequest
1 голос
/ 21 апреля 2020

Я думал, что двойная скобка предназначена для замены __attribute__((foo)), но я не получаю эквивалентности.

Набор инструментов Clang для C ++ 14.

class [[packed]] test {};
class __attribute__((packed)) test2 {};

test имеет предупреждение о неизвестном атрибуте packed игнорируется. test2 не имеет предупреждения. Если я заменим packed на подготовленный атрибут, оба выдадут предупреждения.

Какой лучший способ упаковать структуру в Clang?

1 Ответ

2 голосов
/ 21 апреля 2020

Я думал, что двойная скобка предназначена для замены __attribute__((foo)), но я не получаю эквивалентности.

Это не означает, что она полностью эквивалентна. Двойная скобка предназначена для того, чтобы стандарт C ++ вводил атрибуты с более или менее стандартным значением. Они часто уже существуют как атрибуты c, определяемые компилятором, но это не означает, что все атрибуты c, определяемые компилятором, имеют соответствующий стандартный атрибут. Таким образом, вы не можете ожидать, что [[packed]] будет вещью только потому, что __attribute__((packed)) есть.

Тем не менее, стандарт дает компиляторам возможность добавлять пользовательские атрибуты, которые используют двойные скобки. Но такие атрибуты обычно ограничены. В этом случае пользовательский атрибут называется [[gnu::packed]]. Как следует из названия, это указывается поставщиком c.

...