в чем разница между __attribute __ ((__pack__)); и #pragma pack (1)

Я портирую код, который отлично работает на Linux для Windows Visual C ++.
У меня есть этот код в Linux:

struct exif_desc
{
uint16_t  tag;
uint16_t  type;
uint32_t  length;
uint32_t  value;
}
__attribute__((__packed__));

Я получаю сообщение об ошибке в Windows:

'__packed__' : undeclared identifier

Мне интересно, могу ли я исправить эту ошибку с помощью

#pragma pack(1)

есть ли разница между ними? Есть ли синтаксис, который можно использовать в Linux и Windows для этого атрибута?

3

Решение

__attribute__ является расширением GCC, специфичным для GCC (и других компиляторов, которые пытаются быть совместимыми с GCC).

#pragma pack изначально является специфическим расширением компилятора Visual C ++. Как отмечают комментаторы, он реализован в GCC и для совместимости с VC ++.

Обычно вы не можете использовать расширения в одном компиляторе в другом компиляторе. Дело в точке: __attribute__ не существует как расширение в компиляторе Visual C ++.

3

Другие решения


По вопросам рекламы [email protected]