В чем разница между __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 для этого атрибута?

1 ответ

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

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

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

Другие вопросы по тегам