दिलचस्प पोस्ट
क्यों करता है "मैमेट (arr, -1, sizeof (arr) / sizeof (int))" -1 के लिए एक पूर्णांक सरणी स्पष्ट नहीं? क्या मेरे कंप्यूटर पर विजुअल स्टूडियो का संस्करण अजगर है? जावा में इंटीजर कैशिंग स्ट्रिंग के सभी संभावित क्रमपरिवर्तनों की सूची उत्पन्न करें PHP में 2 एरेज़ को सम्मिलित नहीं किया जा सकता रिक्त स्थान के साथ HTML वर्ग विशेषता, यह एक W3C वैध वर्ग है? कई मापदंडों के साथ Google oauth2 redirect_uri आपका पसंदीदा प्रोफ़ाइल उपकरण क्या है (सी ++ के लिए) पूरी तालिका पंक्ति लिंक करें? एंड्रॉइड टेलीग्राम ऐप -> java.lang.UnsatisfiedLinkError: शून्य के लिए कोई क्रियान्वयन नहीं मिला एक प्रकार के ऑब्जेक्ट serializing करते समय एक परिपत्र संदर्भ का पता चला था 'सबसोनिक.Schema .DatabaseColumn' एक COUNTIF कुल फ़ंक्शन के SQL सर्वर समतुल्य Postgresql: उपयोगकर्ता "पोस्टग्रेज़" के लिए पासवर्ड प्रमाणीकरण विफल क्या कोई ओ (एन) पूर्णांक सॉर्टिंग एल्गोरिदम है? डॉकर डॉकर डेमन से कनेक्ट नहीं हो सकता

विजुअल C ++ जीसीसी के __त्तात्व__ के बराबर ((__ पैक्ड__))

कुछ कंपाइलर के लिए, स्ट्रक्क्ट्स के लिए एक पैकिंग स्पेसिफायर है, उदाहरण के लिए:

 RealView एआरएम संकलक "__ पैकेट" है
 ग्नू सी कंपाइलर में "__त्तात्व__ ((__ पैक्ड__) है"
 विजुअल सी ++ के पास कोई समतुल्य नहीं है, इसमें केवल "#प्रगमा पैक (1)" है

मुझे कुछ चाहिए जो मुझे संरचना की परिभाषा में डाल सकें

कोई जानकारी / हैक / सुझाव? TIA …

वेब के समाधान से एकत्रित समाधान "विजुअल C ++ जीसीसी के __त्तात्व__ के बराबर ((__ पैक्ड__))"

मुझे यह करने का एक चालाक तरीका नहीं पता, लेकिन संभवतः आप ऐसा कुछ भयानक काम कर सकते हैं:

 #include "packed.h" struct Foo { /* members go here */ } PACKED; #include "endpacked.h" 

फिर एमएसवीसी के लिए, packed.h:

 #define PACKED #pragma pack(push,1) 

endpacked.h

 #pragma pack(pop) #undef PACKED 

जीसीसी के लिए, packed.h:

 #define PACKED __attribute__ ((__packed__)) 

endpacked.h:

 #undef PACKED 

मौलिक रूप से, पैकिंग भी मंच पर निर्भर है। मान लीजिए कि आपके पैक वाले संरचना में 8-बिट फ़ील्ड हैं, और 16-बिट बाइट के साथ कुछ सिस्टम पर विचार करें। यह आपके डेटा को पैकिंग के द्वारा प्रदर्शित करने वाला एक संरचना नहीं हो सकता – आपको यह जानना होगा कि 8-बिट बाइट्स को 16-बिट बाइट्स में कनवर्ट किया जाता है, जब दो सिस्टम के बीच स्थानांतरित किया जाता है। 16 बिट मशीन पर स्ट्रेट को बिटफ़ेल्ड की आवश्यकता हो सकती है, इस स्थिति में आपको यह जानना होगा कि कार्यान्वयन कैसे उन्हें बाहर रखता है।

इसलिए यदि कोड का उद्देश्य आम तौर पर पोर्टेबल होना है, तो आपको अपनी हेडर फ़ाइल के किसी प्लेटफॉर्म-विशिष्ट अनुभाग में जो भी पैक की गई संरचनाओं को परिभाषित करना होगा। या बल्कि, अपने कोड को व्यवस्थित करें ताकि एक भावी पोर्ट ऐसा कर सकें, अगर उसे करना है

आप इस तरह से पैन को जीएनयू जीसीसी के लिए परिभाषित कर सकते हैं

 #define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) 

और दृश्य सी ++ के लिए इस तरह:

 #define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) 

और इसे इस तरह प्रयोग करें:

 PACK( struct myStruct { int a; int b; }); 

मुझे पता है कि यह प्रश्न पुराना है, लेकिन मेरा मानना ​​है कि पहले पोस्ट किए गए लोगों की तुलना में बेहतर समाधान है। एमएसवीसी मामले में प्रामाणिकता को सभी के बाद संरचना घोषणा रेखा में रखा जा सकता है। निम्नलिखित को धयान मे रखते हुए:

 #ifdef _MSC_VER # define PACKED_STRUCT(name) \ __pragma(pack(push, 1)) struct name __pragma(pack(pop)) #elif defined(__GNUC__) # define PACKED_STRUCT(name) struct __attribute__((packed)) name #endif 

तो इसका उपयोग इस प्रकार किया जा सकता है:

 typedef PACKED_STRUCT() { short a; int b } my_struct_t; PACKED_SRUCT(my_other_struct) { short a; int b }; 

आदि।

यहां कुंजी यह है कि __प्रज्ञ का उपयोग केवल संरचना की घोषणा रेखा के आसपास होना चाहिए। यह संरचना नाम शामिल करने की आवश्यकता है अगर यह एक दिया गया है, इसलिए मैक्रो के लिए एक पैरामीटर नाम है बेशक, Enum / class तक विस्तार करना आसान है, जो मैं पाठक को एक अभ्यास के रूप में छोड़ दूँगा!

पैक दस्तावेज़ीकरण एमएसडीएन पृष्ठ पर परीक्षण कार्यक्रम यह सत्यापित करने के लिए उपयोगी है।

संपादित करें

यह मेरे परीक्षण में पता चला है कि मैं विंडोज पर इंटेल कंपाइलर का उपयोग कर रहा था। आईसीएल.एक्सई का उपयोग इस समस्या को बिना किसी समस्या के काम करता है, लेकिन माइक्रोसॉफ्ट कंपाइलर (सीएल। एक्सई) के साथ, यह (2010 और 2013 के साथ परीक्षण नहीं)

एक अन्य समाधान, यह निर्भर करता है कि आप किस आधार पर कंपाइलर्स का समर्थन करना चाहते हैं, यह ध्यान देना चाहिए कि जीसीसी ने माइक्रोसॉफ्ट-स्टाइल पैकिंग प्रोगामा को कम से कम संस्करण 4.0.4 (ऑनलाइन प्रलेखन gnu.org पर संस्करण 3.4.6 और 4.0.4 के लिए उपलब्ध है – प्रगामाओं को पूर्व में वर्णित नहीं किया गया है और बाद में हैं)। यह आपको परिभाषा के बाद #pragma pack(push,1) संरचना की परिभाषा के पहले और #pragma pack(pop) करने देता है और यह या तो में संकलन करेगा।

जीसीसी वीसी + + पैक संबंधित प्रगामाओं का समर्थन करता है, क्योंकि आप इसे दूसरे तरीके से गोल कर सकते हैं। अधिक जानकारी के लिए यहां देखें

निकालें …

माइक्रोसॉफ्ट विंडोज कंपाइलर्स के साथ संगतता के लिए, जीसीसी #pragma डायरेक्टिव्स के एक सेट का समर्थन करता है जो संरचनाओं के सदस्य (शून्य-चौड़ाई बिटफ़्लुड्स के अलावा), यूनियनों और बाद में परिभाषित वर्गों के अधिकतम संरेखण को बदलते हैं। हमेशा नीचे n मान दो की एक छोटी सी शक्ति होना आवश्यक है और बाइट्स में नए संरेखण को निर्दिष्ट करता है।

#pragma pack(n) बस नए संरेखण सेट करता है

#pragma pack() उस संरेखण को सेट करता है जो कि जब संकलन शुरू हुआ (कमांड लाइन विकल्प -fpack-struct[=<n>] देखें कोड जनरल विकल्प)।

#pragma pack(push[,n]) एक आंतरिक स्टैक पर वर्तमान संरेखण सेटिंग को धक्का देता है और फिर वैकल्पिक रूप से नया संरेखण सेट करता है।

#pragma pack(pop) संरेखण सेटिंग को आंतरिक स्टैक के शीर्ष पर सहेजा गया एक को पुनर्स्थापित करता है (और वह स्टैक प्रविष्टि निकाल देता है)

ध्यान दें कि #pragma pack([n]) इस आंतरिक स्टैक को प्रभावित नहीं करता है; इस प्रकार, #pragma pack(push) बाद कई #pragma pack(n) उदाहरणों के बाद और एकल #pragma pack(pop) द्वारा अंतिम रूप दिया जा सकता है।

कुछ लक्ष्य, जैसे i386 और powerpc, ms_struct #pragma समर्थन करता है जो दस्तावेज __attribute__((ms_struct)) रूप में एक संरचना देता है।

#pragma ms_struct on घोषित संरचनाओं के लिए लेआउट चालू करता है।

#pragma ms_struct off घोषित संरचनाओं के लिए लेआउट #pragma ms_struct off करता है।

#pragma ms_struct reset डिफ़ॉल्ट लेआउट पर वापस चला जाता है

आपको संरचना में जाने के लिए कुछ की आवश्यकता क्यों है?

मुझे लगता है कि #pragma pack(1) समान है, या क्या मुझे कुछ याद आ रहा है?

तुम यह केर सकते हो:

 struct Foo { #pragma pack(push, 1) int Bar; #pragma pack(pop) }; 

लेकिन यह बदसूरत लग रहा है।