← All posts tagged MS

#include <stdio.h>
#pragma pack(push,1)
struct __attribute__ ((ms_struct)) p1 /* без атрибута в MSVC -- 13 */
{
  char c;
  int  i;
};
#pragma pack(pop)
struct __attribute__ ((packed, ms_struct)) p2
{
  char c;
  int  i;
};
struct __attribute__ ((packed, gcc_struct)) p3
{
  char c;
  int  i;
};
int main (void)
{
  printf ("p1: %d\np2: %d\np3: %d\n", sizeof (struct p1), sizeof (struct p2),
	  sizeof (struct p3));	/* Ответ: 5 8 5 */
}

Я правильно понимаю, что отсутствие упаковки в случае p2 это бага GCC (gcc version 4.6.2)? То есть по идее два определения:
> #pragma pack(push,1)
> struct __attribute__ ((ms_struct)) p1 { ... };
> #pragma pack(pop)
и
> struct __attribute__ ((ms_struct, packed)) p2 { ... };
должны быть эквивалентны.

Кому интересно, отличия в запаковке между MSVC и GCC можно увидеть на таком примере:

#include <stdio.h>
#pragma pack(push,1)
struct __attribute__ ((ms_struct)) ms /* Соответствует поведению MSVC */
{
  unsigned long bf_1 : 12;
  unsigned long bf_2 : 12;
};
struct __attribute__ ((gcc_struct)) gcc
{
  unsigned long bf_1 : 12;
  unsigned long bf_2 : 12;
};
#pragma pack(pop)
int
main (void)
{
  printf ("ms: %d\n" "gcc: %d\n", /* Ответ: 4 3 */
	  sizeof (struct ms), sizeof (struct gcc));
}