2012-04-24 10 views
9

उदाहरण के लिए, एक साझा लाइब्रेरी के अनुरूप निम्न शीर्षलेख फ़ाइल मानना। साझा लाइब्रेरी एक संकलक का उपयोग कर बनाया गया है और फिर इसे क्योंकि एक अलग से काम नहीं कर सकते सी कोड एक और संकलक के साथ बनाया से प्रयोग किया जाता हैसी कंप्रेसर में संरचना संरेखण और पोर्टेबिलिटी

// lib.h 

typedef struct { 
    char c; 
    double d; 
    int i; 
} A; 

DLL_EXPORT void f(A* p); 

: निर्यात समारोह एक कस्टम संरचना इस हेडर में निर्धारित करने के लिए एक सूचक लेता है स्मृति संरेखण, Memory alignment in C-structs के अनुसार सुझाव देता है। तो, क्या एक ही मंच पर विभिन्न कंपाइलरों में मेरी संरचना परिभाषा पोर्टेबल बनाने का कोई तरीका है?

मुझे विशेष रूप से विंडोज प्लेटफार्म में दिलचस्पी है (जाहिर है कि इसमें एक अच्छी तरह से परिभाषित एबीआई नहीं है), हालांकि अन्य प्लेटफॉर्म के बारे में भी जानना उत्सुक होगा।

+3

नहीं, जब तक कि कोई आपको गारंटी देता है। –

+3

कोई डुप्लिकेट नहीं। कम से कम प्रश्न का चयन नहीं किया गया। यह स्वयं ही खड़ा हो सकता है। –

+1

क्या कोई प्रश्न "स्ट्रक्चर संरेखण" शब्द को स्वचालित रूप से उस अन्य प्रश्न का एक डुप्लिकेट है, जब उसके पास इसके साथ कुछ लेना देना नहीं है? .. –

उत्तर

11

टीएल; अभ्यास में डीआर आपको ठीक होना चाहिए।

सी मानक इसे परिभाषित नहीं करता है लेकिन एक प्लेटफार्म एबीआई आमतौर पर करता है। यही है, किसी दिए गए सीपीयू आर्किटेक्चर और ऑपरेटिंग सिस्टम के लिए, सी मैप्स असेंबली के लिए एक परिभाषा हो सकती है जो विभिन्न कंप्यूटर्स को इंटरऑपरेट करने की अनुमति देती है।

स्ट्रक्चर संरेखण एकमात्र चीज नहीं है जिसे प्लेटफॉर्म एबीआई को परिभाषित करना है, आपके पास कॉलिंग कॉन्फ़्रेंस और उस तरह की चीजें भी हैं।

सी ++ यह और भी जटिल बना देता है और एबीआई vtables, अपवाद, नाम mangling, आदि

विंडोज़ पर मुझे लगता है कि कई सी ++ Abis संकलक के आधार पर देखते हैं निर्दिष्ट करने के लिए है, लेकिन सी compilers भर में ज्यादातर संगत है। मैं गलत हो सकता था, विंडोज विशेषज्ञ नहीं।

कुछ लिंक:

वैसे भी लब्बोलुआब यह है कि आप अपनी गारंटी के लिए देख रहे है कि मंच/कंपाइलर एबीआई स्पेक, सी मानक नहीं।

+0

आपके प्रयासों के लिए धन्यवाद, हालांकि मेरा प्रश्न सी ++ से बिल्कुल चिंता नहीं करता है। मैं एबीआई के बारे में जानता हूं, यही कारण है कि मैंने विंडोज-विशिष्ट सवाल को चिह्नित किया क्योंकि मैंने विंडोज़ पर एबीआई विनिर्देशों के बारे में कभी नहीं सुना है। –

+0

@ 7vies: सी में एबीआई भी है (विभिन्न कॉलिंग सम्मेलनों, सीडीसीएल, एसडीडीकॉल, फास्टकॉल के बारे में सोचें)। यह सिर्फ इतना है कि सी के लिए अलग-अलग कंपाइलर आमतौर पर समान होते हैं (कम से कम 'सामान्य' कॉलिंग सम्मेलनों के लिए), यदि सिस्टम कॉल के लिए ओएस की अपेक्षा करने के मुकाबले कोई अन्य कारण नहीं है। सी ++ के साथ अलग-अलग कंपाइलर्स अक्सर * एक ही एपीआई पर सहमत नहीं होते हैं, खासकर बाहरी नामों के लिए। –

+0

@ माइकलबुर, एक साइड नोट के रूप में, विकिपीडिया का कहना है कि ये _x86_ सम्मेलन हैं, क्या वे अन्य आर्किटेक्चर पर भी उपयोग किए जाते हैं? मुझे सी ++ मुद्दों से अवगत है, इसलिए मैं यह पूछ रहा हूं कि इसे शुद्ध सी में कैसे काम करना है। कॉलिंग सम्मेलन पोर्टेबल इंटरफेस को परिभाषित करने में मदद करते हैं, लेकिन संरचना संरेखण के साथ मेरी समस्या का समाधान नहीं करते हैं। –

1

न केवल यह गारंटी नहीं है, लेकिन यदि आप एक ही कंपाइलर का उपयोग करते हैं तो भी निर्माण में उपयोग किए जाने वाले विभिन्न कंपाइलर स्विच के कारण मतभेद हो सकते हैं, या यदि आप एक ही कंपाइलर और उसी स्विच के विभिन्न संस्करणों का उपयोग करते हैं (इसमें हुआ एक एम्बेडेड कंपाइलर जिस पर मैंने काम किया)।

आपको यह सुनिश्चित करने की ज़रूरत है कि structs बिल्कुल समान रूप से प्रदर्शित हों, स्विच का उपयोग करें, #pragmas, जो भी कंपेलर आपको देता है।

मेरी सलाह - इस से पूरी तरह से रहने के लिए। फ़ंक्शन में अपने तर्क पास करें, एक स्ट्रक्चर के भीतर लपेटा नहीं है।

और यहां तक ​​कि इस सरल रूप में, यदि आप दो कंपाइलरों से निपटते हैं, तो यह मामूली नहीं है। आपको यह सुनिश्चित करने की ज़रूरत है कि एक int बाइट्स की एक ही संख्या लेता है, उदाहरण के लिए। कन्वेंशन को भी कॉल करना - तर्क आदेश - बाएं से दाएं या दाएं से बाएं - कंपाइलर के बीच भिन्न हो सकता है।

3

निश्चित रूप से जानने के लिए एकमात्र तरीका प्रश्न में संकलक के दस्तावेज़ीकरण से परामर्श करना है।हालांकि, आमतौर पर यह मामला है कि सी स्ट्रक्चर लेआउट (जैसा कि आप कहते हैं, बिटफिल्ड के लिए) को आपके द्वारा उपयोग किए जा रहे पर्यावरण के लिए एबीआई विवरण द्वारा परिभाषित किया गया है, और सी कंपाइलर मूल एबीआई का पालन करेंगे।

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