2015-09-16 10 views
8

ho questo programma di esempio riportato di seguito#pragma pack() con push e pop vs disfare

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

uscita del programma di cui sopra è

size of struct a 6 
size of struct b 12 

Ora se cambio la dichiarazione struct come di seguito:

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

uscita del programma è

size of struct a 6 
size of struct b 6 

Perché questa differenza nel comportamento? La mia comprensione è che entrambe le dichiarazioni di struttura stanno facendo la stessa cosa.

Sto eseguendo questo sul mio 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

Quale compilatore stai utilizzando? – slugonamission

+5

Immagino che tu stia utilizzando MSVC. AFAICT non c'è pragma 'unpack()' – Hasturkun

+2

@Hasturkun - I compilatori Renesas supportano '#pragma unpack', anche se non sembrano supportare' #pragma pack (push) ': S. – slugonamission

risposta

2

il compilatore non sa nulla di unpack() pragma, e solo lo ignora, così le stesse regole di imballaggio vengono applicate entrambe le strutture.

MSVC Il compilatore emetterà un avviso sulle direttive sconosciute #pragma al primo livello di avviso.

Entrambi GCC e Clang mantenere il silenzio di default. Devi usare la bandiera -Wunknown-pragmas.

+2

Ignora? Per prima cosa ho sentito. Questi compilatori lamentosi si lamenteranno di qualsiasi cosa ... – trojanfoe

+1

@trojanfoe yes, 'MSVC' emette un avviso di default,' GCC' richiede '-Wunknown-pragmas'. Immagino che 'Clang' mantenga il silenzio di default. Ad ogni modo, non sono trattati come errori. – Stas

Problemi correlati