2010-05-03 5 views
9

के लिए एक सी ++ रैपर लिखना मेरे पास एक विरासत सी लाइब्रेरी है, जिसे ओओ टाइप फॉर्म में लिखा गया है। विशिष्ट कार्यों की तरह हैं:सी पुस्तकालय

LIB *lib_new(); 
void lib_free(LIB *lib); 
int lib_add_option(LIB *lib, int flags); 
void lib_change_name(LIB *lib, char *name); 

मैं अपने सी ++ प्रोग्राम में इस लाइब्रेरी का उपयोग करना चाहते, तो मैं एक सी ++ आवरण की आवश्यकता है सोच रहा हूँ। सब से ऊपर की तरह कुछ करने के लिए मैप करने के लिए प्रतीत होता है:

class LIB 
{ 
    public: 
     LIB(); 
     ~LIB(); 
     int add_option(int flags); 
     void change_name(char *name); 
... 
}; 

मैं एक सी ++ आवरण दौर सी पहले कभी नहीं लिखा है, और इसके बारे में ज्यादा सलाह नहीं मिल रहा। क्या यह एक सी ++/सी रैपर बनाने के लिए एक अच्छा/ठेठ/समझदार दृष्टिकोण है?

उत्तर

8

ए सी ++ रैपर की आवश्यकता नहीं है - आप बस अपने सी ++ कोड से सी फ़ंक्शंस को कॉल कर सकते हैं। आईएमएचओ, सी कोड को लपेटना सबसे अच्छा नहीं है - अगर आप इसे सी ++ कोड में बदलना चाहते हैं - ठीक है, लेकिन एक पूर्ण पुनः लिखें।

व्यावहारिक रूप से, अपने सी कार्यों संभालने एक फ़ाइल बुलाया myfuncs.h घोषित किये गए हैं तो अपने सी ++ कोड में आप उन्हें इस तरह शामिल करना चाहते हैं जाएगा:

extern "C" { 
    #include "myfuncs.h" 
} 

ताकि उन्हें सी लिंकेज देने के लिए जब साथ संकलित सी ++ कंपाइलर।

+0

खुद को दोहराना नहीं है? –

+0

@Neil: combative मत बनो? –

+6

मैं असहमत हूं (लेकिन कोई डाउनवोट नहीं)। सरल सी libs के लिए, एक रैपर अक्सर अनावश्यक है। हालांकि, अधिक जटिल सी libs के लिए, एक हल्के सी wrapper अमूल्य हो सकता है। एक उदाहरण स्प्रिंग्स को ध्यान में रखता है: टिब्को के पास टिब्रव के चारों ओर एक बहुत हल्का आवरण है जो बेहद सहायक है। –

2

मुझे लगता है कि यह केवल एक रैपर लिखने के लिए समझ में आता है अगर यह लाइब्रेरी का उपयोग सरल बनाता है। आपके मामले में, आप इसे एलआईबी * पास करने के लिए अनावश्यक बना रहे हैं, और संभवतः स्टैक पर एलआईबी ऑब्जेक्ट्स बनाना संभव होगा, इसलिए मैं कहूंगा कि यह एक सुधार है।

+0

अभी भी LIB :: LIB ऑब्जेक्ट्स को पास करना आवश्यक है। और स्टैक पर एलआईबी :: एलआईबी ऑब्जेक्ट्स आवंटित करने से आपको केवल ऑटो सेमेन्टिक्स मिलेंगे, क्योंकि शायद नए सी एलआईबी ऑब्जेक्ट को निर्माण में ढेर पर आवंटित किया जाएगा। लेकिन इसके बावजूद, सी ++ रैपर अभी भी आसान है। –

2

आम तौर पर मैं इसका कैसे संपर्क करूंगा। मैं char * का भी उपयोग नहीं करता लेकिन std :: string का उपयोग करता हूं।

1

प्रति सी ++ रैपर की आवश्यकता नहीं है। आपके कोड में सी फ़ंक्शंस को कॉल करने से आपको रोक नहीं है।

1

मैं भी कुछ थोड़ा बेहतर करने के लिए उदारीकरण का नाम बदलने पर देखने हैं तो कुछ नहीं "लिब"

नाम बदलें एक गेटर सेटर होने की संभावना है ...

तो getName (चार *) SetName (char *)

और उसके बाद इसे char * के बजाय std :: string में बदलना देखें, यदि उसके SetName (const std :: string name) यह पैरामीटर के रूप में char * स्वीकार करेगा। जैसे रूपांतरण ऑपरेटर के साथ

class Database: boost::noncopyable { 
    public: 
    Database(): handle(db_construct()) { 
     if (!handle) throw std::runtime_error("..."); 
    } 
    ~Database() { db_destruct(handle); } 
    operator db_t*() { return handle; } 
    private: 
    db_t* handle; 
}; 

इस के साथ इस्तेमाल किया जा सकता:

यानी, धीरे-धीरे सी ++ वाद

5

मैं आमतौर पर केवल एक साधारण आरए II आवरण के बजाय प्रत्येक सदस्य समारोह लपेटकर के लिखने के लिए कदम सी कार्य:

Database db; 
db_access(db, ...); // Calling a C function with db's type conversion operator