Я бы вообще старался избегать использования #pragmas, если это возможно, так как они чрезвычайно зависимы от компилятора и не переносимы. Если вы хотите использовать их в портативном режиме, вам придется окружить каждую прагму парой #if
/ #endif
. GCC не рекомендует использовать прагмы и поддерживает только некоторые из них для совместимости с другими компиляторами; В GCC есть другие способы сделать то же, что и в других компиляторах.
Например, вот как вы должны обеспечить плотную упаковку структуры (т. Е. Отсутствие заполнения между элементами) в MSVC:
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
Вот как вы можете сделать то же самое в GCC:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
Код GCC более переносим, потому что если вы хотите скомпилировать его с помощью компилятора без GCC, все, что вам нужно сделать, это
#define __attribute__(x)
Принимая во внимание, что если вы хотите портировать код MSVC, вы должны окружить каждую прагму парой #if
/ #endif
. Не очень.