2012-08-31 37 views
15

雖然__attribute__ ((aligned))與typedef聲明運作良好,如:是否在typedef聲明上忽略__attribute__((__packed__))?

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

您在這裏合併了兩條語句。

首先你定義一個具有某些屬性的結構體。 然後你爲它創建一個別名。

當您將packed屬性分配給別名時,此別名使用的已創建數據結構將不會被更改。 (通常你可以用「struct bla」和「s_bla」[由typedef struct bla {} s_bla「]創建變量,並相互交換這些值。如果可以通過typedef來改變結構,這種一致性將打破。)

所以:聲明將被傾銷。

0

試試這個。這可能工作。

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

typedef struct test test_t; 

test_t var1, var2; 
9

該聲明看起來對我來說沒問題!

它可以用這些方法之一來聲明。

#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,我認爲最好避免它,如here所述,並嘗試舊式結構申報樣式。

+0

哇這工作,這是非常危險的,idk爲什麼它仍然是一個東西。 – Dmitry

6

您的聲明似乎沒問題,但它依賴於編譯器。例如,如果你想讓MinGW編譯器尊重它,你必須用-mno-ms-bitfields參數編譯你的程序。如果您不指定此標誌,則不會發出警告,但該屬性未被遵守!