2015-01-08 47 views
2

我正在嘗試以下操作,在win32上使用gcc。我是否誤解了GCC中的__attribute__((packed))?

#include <stdio.h> 

struct st { char c; int x; } __attribute__ ((packed)); 

int main() { 
    printf("%d\n", sizeof(struct st)); 
    return 0; 
} 

我期望打印的值是5,但它是8

具有以下,不過,我得到5

#include <stdio.h> 

#pragma pack(1) 
struct st { char c; int x; }; 

int main() { 
    printf("%d\n", sizeof(struct st)); 
    return 0; 
} 

一定有什麼地方錯在我的計劃,但我看不到什麼。 我已閱讀gcc's manual和關於此的幾個問題,我仍然感到困惑。任何提示?

也從這些問題的答案,我明白,我不應該使用打包結構爲marshalling,我可能不會使用它很多,但我仍然想明白我無法看到這樣一個簡短的程序。

注意:gcc-4.9.2和gcc-4.8.4都會出現問題。

+2

對我來說,它的工作原理。 http://codepad.org/Zrilgx9t –

+0

@Jayesh好吧,那麼,我有gcc-4.9.2 [mingw-w64](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting% 20Win32/Personal%20Builds/mingw-builds/4.9.2 /),這可能是這個版本的問題嗎? – Nivak

+0

首先,你應該寫%lu而不是%d – yakoudbz

回答

2

你在錯誤的地方屬性 - 試試這個:

struct st { char c; 
      int x __attribute__ ((packed)); 
      }; 

按在GCC手冊中的例子,這將導致x進行包裝,使其緊跟c

當然,你首先不應該這麼做,因爲你的代碼在某些架構上會崩潰,即使它沒有被破解,也可能會有性能問題。

+0

OP的代碼適用於我,因此在末尾放置'__attribute__((packed))'應該沒問題 – Gopi

+0

@Gopi,我不確定這個:packed屬性指定**變量或結構字段**應該有儘可能最小的對齊方式 - 一個字節用於變量,一個字段用於字段,除非您使用aligned屬性指定較大的值。 –

+0

@AlterMann和@PaulR根據我在網上發現的所有內容,它應該在struct(或甚至在'struct __attribute__((packed))st {char c; int x;};')之後工作。但請參閱Jayesh的評論,我認爲這是一個錯誤。 – Nivak

0

在我的環境中正常工作Centos 5.11(64bit) 爲您提到的第一種情況打印出5個。

gcc版本4.9.1(GCC)

GCC file.c

./a.out 
+0

根據Jayesh的[上面的鏈接](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991),這是mingw的問題。我在[32]中重現了與gcc-4.8.4或gcc-4.9.2相同的問題(http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw -builds /)和[64位](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/),使用mingw-w64。無論如何,謝謝你的回答。 – Nivak