Является ли __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;