2015-09-16 23 views
8

我有這樣的示例程序低於上述程序的的#pragma pack()的與推入和彈出VS解壓

#include <stdio.h>        
#include <stdlib.h> 

#pragma pack(push) 
#pragma pack(1) 
typedef struct{ 
    char a; 
    int b; 
    char c; 
}st_a; 
#pragma pack(pop) 

typedef struct{ 
    char a; 
    int b; 
    char c; 
}st_b; 


int main() 
{ 
    printf("size of struct a %zd \n",sizeof(st_a)); 
    printf("size of struct b %zd \n",sizeof(st_b)); 

    return 0; 
} 

輸出是

size of struct a 6 
size of struct b 12 

現在,如果更改,如下所述結構聲明:該方案的

#pragma pack(1) 
typedef struct{ 
    char a; 
    int b; 
    char c; 
}st_a; 
#pragma unpack() 

輸出是

size of struct a 6 
size of struct b 6 

爲什麼這種行爲差異?我的理解是,兩個結構聲明都在做同樣的事情。

我在MBP上運行這個。

$gcc --version 

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 
Target: x86_64-apple-darwin14.4.0 
Thread model: posix 
+1

您正在使用哪種編譯器? – slugonamission

+5

我猜你正在使用MSVC。 AFAICT沒有編譯'unpack()' – Hasturkun

+2

@Hasturkun - 儘管瑞薩編譯器支持'#pragma unpack',但似乎不支持'#pragma pack(push)':S。 – slugonamission

回答

2

你的編譯器一無所知unpack()編譯,只是忽略它,所以相同的填充規則適用於兩種結構。

MSVC編譯器將在第一個警告級別發出關於未知#pragma指令的警告。

GCCClang默認情況下保持靜音。您需要使用-Wunknown-pragmas標誌。

+2

忽略它?首先我聽說過。那些抱怨編譯器會抱怨什麼...... – trojanfoe

+1

@trojanfoe是的,'MSVC'默認發出警告,'GCC'需要'-Wunknown-pragmas'。我猜'克朗'也默認保持沉默。無論如何,他們不會被視爲錯誤。 – Stas