2015-09-16 7 views
8

मैं इस नमूने कार्यक्रम है नीचे से ऊपर कार्यक्रम के#pragma पैक() धक्का और पॉप बनाम खोल

#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 

अब है अगर मैं नीचे के रूप में struct घोषणा को बदलने के साथ: कार्यक्रम के

#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 

व्यवहार में यह अंतर क्यों है? मेरी समझ यह थी कि दोनों संरचना घोषणाएं एक ही काम कर रही हैं।

मैं इसे अपने एमबीपी पर चला रहा हूं।

$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

मुझे लगता है कि आप एमएसवीसी का उपयोग कर रहे हैं। AFAICT में कोई प्रगति नहीं है 'अनपैक() ' – Hasturkun

+2

@ हस्तार्कुन - रेनेसास कंपाइलर्स' #pragma unpack' का समर्थन करते हैं, लेकिन 'pragma पैक (पुश) 'एस का समर्थन नहीं करते हैं। – slugonamission

उत्तर

2

आपका संकलक unpack() के बारे में pragma में कुछ नहीं जानता, और बस यह ध्यान नहीं देता, इसलिए एक ही पैकिंग नियमों दोनों संरचनाओं के लिए लागू कर रहे हैं।

MSVC कंपाइलर पहले चेतावनी स्तर पर अज्ञात #pragma निर्देशों के बारे में चेतावनी जारी करेगा।

GCC और Clang डिफ़ॉल्ट रूप से चुप्पी रखें। आपको -Wunknown-pragmas ध्वज का उपयोग करने की आवश्यकता है।

+2

इसे अनदेखा करता है? सबसे पहले मैंने सुना है। जो चमकदार कंपाइलर्स कुछ भी शिकायत करेंगे ... – trojanfoe

+1

@trojanfoe हां, 'एमएसवीसी' डिफ़ॉल्ट रूप से एक चेतावनी जारी करता है, 'जीसीसी' को 'अज्ञात-प्रगति' की आवश्यकता होती है। मुझे लगता है कि 'क्लैंग' भी डिफ़ॉल्ट रूप से चुप्पी रखता है। वैसे भी, उन्हें त्रुटियों के रूप में नहीं माना जाता है। – Stas

संबंधित मुद्दे