2013-05-27 8 views
5

मुझे पता है कि यह एक परियोजना के विकास का एक अच्छा तरीका नहीं है, लेकिन मेरे काम के कुछ कारणों से मैं सी ++ (एलआरयू कैश और हैश मानचित्र) में कुछ डेटा संरचनाओं को एकीकृत करने के लिए प्रतिबद्ध हूं। सी परियोजना।सी ++ डेटा संरचनाओं के साथ सी कोड

अब तक मुझे पता है कि extern "C" का उपयोग कर सी ++ में सी कार्यों को कॉल करने का कोई तरीका है, लेकिन सी से ++ ऑब्जेक्ट्स (विधियों ...) को कॉल करने के बारे में क्या है?

मैं जीसीसी का उपयोग कर रहा हूं।

+1

AFAIK, आप नहीं कर सकते। सी ++ कार्यों के लिए सी रैपर प्रदान किए बिना, और ऑब्जेक्ट्स को structs/opaque पॉइंटर्स के रूप में उजागर किए बिना। (और, ठीक है, सी ++ में पॉइंटर्स का उपयोग करना "बुरा" है।) – millimoose

उत्तर

6

यदि सभी कोड सी ++ कंपाइलर के साथ संकलित किए जा रहे हैं तो वहां कोई (या बहुत कम) समस्या नहीं होनी चाहिए।

यदि आपके पास जी ++ के साथ संकलित जीसीसी और सी ++ के साथ संकलित है तो आपको कार्यों के एक सेट के माध्यम से सी ++ कोड को देखने योग्य बनाने के लिए अपनी कक्षा के चारों ओर एक हेडर रैपर लिखना होगा।

उदाहरण:

MyClass.h

#ifdef __cplusplus 


class MyClass 
{ 
    public: 
     MyClass() {/*STUFF*/} 
     ~MyClass() {/*STUFF*/} 

     int doStuff(int x, float y) {/*STUFF*/} 
}; 

extern "C" { 
#endif 

/* C Interface to MyClass */ 

void* createMyClass(); 
void destroyMyClass(void* mc); 
int  doStuffMyClass(void* mc, int x, float y); 

#ifdef __cplusplus 
} 
#endif 

स्रोत फ़ाइल

MyClass.cpp

#include "MyClass.h" 

void* createMyClass()   {return reinterpret_cast<void*>(new MyClass);} 
void destroyMyClass(void* mc) {delete reinterpret_cast<MyClass*>(mc);} 

int  doStuffMyClass(void* mc, int x, float y) 
{ 
    return reinterpret_cast<MyClass*>(mc)->doStuff(x,y); 
} 

आपका सी कोड अब सिर्फ "MyClass.h" शामिल हैं और का उपयोग करता है सी कार्यों प्रदान की।

MyCFile.c

#include "MyClass.h" 

int main() 
{ 
    void* myClass = createMyClass(); 
    int value = doStuffMyClass(myClass, 5, 6.0); 
    destroyMyClass(myClass); 
} 
+0

+1 बहुत पूरा जवाब! –

6

अपने सी ++ इंटरफेस के चारों ओर एक सी रैपर लिखें। इसे C++ के रूप में संकलित करें, लेकिन extern "C" ब्लॉक में अपना सी इंटरफ़ेस शामिल करना सुनिश्चित करें। इस नए इंटरफ़ेस को आपके सी प्रोग्राम के साथ ठीक से लिंक करना चाहिए और आपको अपने सी ++ कोड तक पहुंच प्रदान करना चाहिए।

5

आपको सी संगत अग्रेषण फ़ंक्शन बनाने की आवश्यकता है जो उनके पहले पैरामीटर को ऑब्जेक्ट में पॉइंटर के रूप में लेते हैं। फ़ॉरवर्डिंग फ़ंक्शन तब [आमतौर पर] सही ऑब्जेक्ट प्रकार पर पहला पैरामीटर डालेगा और उपयुक्त सदस्य फ़ंक्शन को कॉल करेगा।

// Function declaration in header 
extern "C" void function(void *object, int param1, int param2); 

// Function definition in source file 
extern "C" function(void *object, int param1, int param2) 
{ 
    static_cast<Object*>(object)->member_function(param1, param2); 
} 
+0

+1, यह उत्तर मैं जो प्राप्त कर रहा था उसका एक अच्छा उदाहरण है। –

+2

हेडर में 'बाहरी" सी "' के आसपास '#ifdef __cplusplus' को न भूलें ताकि उन्हें सी से उपयोग किया जा सके और सी ++ कोड में उत्पन्न होने वाले किसी अपवाद को पकड़ने के लिए (सी अपवाद पसंद नहीं है। ..)। ऑब्जेक्ट पॉइंटर्स के लिए 'शून्य *' का उपयोग करने के बजाय, कोई भी न्यूनतम प्रकार की सुरक्षा के लिए डमी 'स्ट्रक्चर' को अग्रेषित करना चाहता है। – syam

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