Является ли __attribute__ ((__packed__)) игнорироваться в объявлении typedef?

Хотя __attribute__ ((aligned)) хорошо работает с объявлением typedef, например:

typedef struct __attribute__((__aligned__(8))) A {

     xxx ip    ;
     xxx udp   ;
     xxx ports ;
} table ;

Я столкнулся с утверждениями, которые говорят, что это не относится к __attribute__ ((__packed__)) с typedef! Я рассмотрел некоторые из связанных вопросов, и некоторые из них использовали упакованный атрибут с typedef, который соответствует нашему коду.

Теперь в нашем коде мы определяем

typedef struct {
     xxx ip    ;
     xxx udp   ;
     xxx ports ;
}__attribute__((packed)) table ;

Описывает ли указанное выше выражение компилятор, который молча удаляет декларацию упакованного атрибута?

PS: Да, я мог бы проверить его, но мои обстоятельства сейчас разные. Говорят, праздники и смартфон!

Ответы

Ответ 1

Декларация Кажется мне хорошо!

Он может быть объявлен одним из этих способов.

#include <stdio.h>

   typedef struct __attribute__((packed)) {
    char old;
    int ip;
    int new;
} NCO;

int main(void) {

printf("%d",sizeof(NCO));
} 

или

#include <stdio.h> 
   typedef struct  {
    char old;
    int ip;
    int new;
} __attribute__((packed)) NCO;

int main(void) {

printf("%d",sizeof(NCO));
} 

Убедитесь, что спецификация ключевого слова __attribute__((packed)) и атрибута сразу следуют за правой скобкой (}) объявления структуры. Если он находится в любой другой позиции (например, после экземпляра структуры вместо предшествующего экземпляру структуры), компилятор игнорирует __attribute__((packed)) и выдает предупреждение.

Хотя он дает нам упакованный размер 9, я думаю, что лучше избегать его, как указано здесь, и попробовать стиль декларации старой школьной структуры.

Ответ 2

Ваше выражение, кажется, все в порядке, но оно зависит от компилятора. Например, если вы хотите, чтобы компилятор MinGW уважал это, вы должны скомпилировать свою программу с параметром -mno-ms-bitfields. Если вы не укажете этот флаг, предупреждение не будет выдано, но атрибут не будет соблюден!

Ответ 3

Здесь вы комбинируете два оператора.

Сначала вы определяете структуру с определенными свойствами. Затем вы создаете для него псевдоним.

Когда вы назначаете упакованное свойство псевдониму, уже созданная структура данных, используемая этим псевдонимом, не будет изменена. (Обычно вы можете создавать переменные с "struct bla" и "s_bla" [созданные "typedef struct bla {} s_bla" ] и обменивать эти значения между собой. Если бы можно было изменить структуру с помощью typedef, эта согласованность сломается.)

Итак: Объявление будет сброшено.

Ответ 4

Попробуйте это. Это может сработать.

struct test
{
 unsigned char  field1;
 unsigned short field2;
 unsigned long  field3;
 }__attribute__((__packed__));

typedef struct test test_t;

test_t var1, var2;