• MS code C pack pragma
    #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));
    }
    ♡ recommended by @L29Ah

Replies (0)