2015-09-16 8 views
8

ich dieses Beispielprogramm haben unter#pragma pack() mit Push- und Pop-vs auspacken

#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; 
} 

Ausgabe des obigen Programms ist

size of struct a 6 
size of struct b 12 

Nun, wenn ich die Strukturdeklaration wie unten ändern:

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

Ausgabe des Programms ist

size of struct a 6 
size of struct b 6 

Warum ist dieser Unterschied im Verhalten? Mein Verständnis war, dass beide Strukturdeklarationen dasselbe tun.

Ich führe dies auf meinem 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

Welchen Compiler benutzen Sie? – slugonamission

+5

Ich vermute, dass Sie MSVC verwenden. AFAICT es gibt kein Pragma 'entpacken()' – Hasturkun

+2

@Hasturkun - Die Renesas-Compiler unterstützen '#pragma entpacken' zwar, aber scheinen' 'pragma pack (push)' nicht zu unterstützen: S. – slugonamission

Antwort

2

Ihr Compiler weiß nichts über unpack() Pragma und ignoriert es einfach, so dass die gleichen Verpackungsregeln angewendet werden beide Strukturen.

MSVC Compiler wird eine Warnung über unbekannte #pragma Direktiven auf der ersten Warnstufe ausgeben.

Sowohl GCC als auch Clang werden standardmäßig deaktiviert. Sie müssen -Wunknown-pragmas Flag verwenden.

+2

Ignoriert es? Zuerst habe ich gehört. Diese jammernden Compiler werden sich über alles beschweren ... – trojanfoe

+1

@trojanfoe Ja, 'MSVC' gibt standardmäßig eine Warnung aus,' GCC' erfordert '-Wunknown-Pragmas'. Ich schätze, 'Clang' hält auch standardmäßig still. Wie auch immer, sie werden nicht als Fehler behandelt. – Stas