2012-05-07 19 views
6

मैं SWIG (पायथन को लक्ष्य के रूप में) के साथ एक लाइब्रेरी लपेट रहा हूं। लाइब्रेरी फ़ंक्शंस में डेटाटाइप "uint32_t", "uint8_t" आदि के साथ पैरामीटर शामिल हैं। मैं इंटरफ़ेस को क्रॉस-प्लेटफॉर्म के रूप में संभव बनाना चाहता हूं, इसलिए मैं अपने interface.i फ़ाइल में मूल फ़ंक्शन हस्ताक्षर का उपयोग करना चाहता हूं। उदाहरण के लिए:SWIG के साथ एक क्रॉस प्लेटफ़ॉर्म इंटरफ़ेस कैसे उत्पन्न करें?

uint32_t func(uint32_t a, uint32_t b); 

मुद्दा मैं हल करने के लिए कोशिश कर रहा हूँ कि बड़ा घूँट एक पूर्णांक के रूप में पैरामीटर पहचान नहीं होगा जब तक कि वहाँ है uint32_t डेटाप्रकार पर एक typedef है। ठीक पर है

>>> mylib.func(2, 2) 
TypeError: in method 'func', argument 1 of type 'uint32_t' 

पिछले typedef:

typedef unsigned uint32_t; 

निकाला जा रहा है कि typedef लाइन समारोह का कारण लक्ष्य पायथन बंधन से प्रतिदेय नहीं होगा: अभी मैं इंटरफ़ेस फ़ाइल पर यह उपयोग कर रहा हूँ मेरी स्थानीय मशीन, लेकिन किसी अन्य कंपाइलर/मंच पर अलग हो सकती है। निर्देश %include "stdint.h" का उपयोग करना बड़ा घूँट पर एक त्रुटि बढ़ा देंगे:

/usr/include/stdint.h:44: Error: Syntax error in input(1). 

कौन सा समझ में आता है के बाद से बड़ा घूँट एक पूर्ण विशेषताओं संकलक नहीं है, और पूरी तरह से है कि शीर्ष लेख पर सभी #ifdef का मूल्यांकन नहीं कर सकते हैं।

मैं stdint.h हेडर पर संकलक चुनने वाले डेटाटाइप के साथ सही ढंग से SWIG कैसे खिला सकता हूं? वास्तव में सही डेटाटाइप को कड़ाई से लागू करने के लिए समझ में आता है, या typedef सभी intX_t से long ठीक है?

उत्तर

11

आप इन प्रकार के उपयोग करने के लिए अपने बड़ा घूँट इंटरफ़ेस फ़ाइल में आप की तरह कुछ कर सकते हैं चाहते हैं:

%module test 
%include "stdint.i" 

uint32_t my_function(); 

कौन सा एक मौजूदा बड़ा घूँट है इंटरफ़ेस में आपके सिस्टम के लिए सही typedef एस है।

0

आपको टाइपपीफ को मजबूर करना चाहिए क्योंकि uint32_t क्रॉस प्लेटफ़ॉर्म नहीं है और क्रॉस कंपाइलर नहीं है। uint32_t सी 99 मानक है लेकिन कई कंपाइलर्स ने पूरी तरह से इस मानक को लागू नहीं करने का फैसला किया है। आप एक अपनी परियोजना के प्रकार के एक क्रॉस संकलक तरह से फिर से परिभाषित करने में शामिल हो सकते हैं:

http://www.azillionmonkeys.com/qed/pstdint.h

यह हैडर मैं ऊपर लिंक की शुरूआत को पढ़ने के लिए लायक है। आप इसका उपयोग stdint.h के बजाय शामिल कर सकते हैं।

आप भी इस सवाल पढ़ सकते हैं:

Cross-platform primitive data types in C++

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