इसका उत्तर मैंने एक वर्तमान प्रश्न के उत्तर में दिया है, जो C के लिए एक जेनेरिक लाइब्रेरी के बारे में पूछता है - प्रश्नकर्ता विशेष रूप से बताता है कि वे C ++ का उपयोग नहीं करना चाहते हैं।
C एक पूर्ण प्रोग्रामिंग भाषा है। C, C ++ का एक मनमाना उपसमुच्चय नहीं है। C, C ++ का सबसेट नहीं है।
यह मान्य सी है:
foo_t* foo = malloc ( sizeof(foo_t) );
इसे C ++ के रूप में संकलित करने के लिए आपको लिखना होगा:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
जो किसी भी अधिक सी मान्य नहीं है। (आप सी-स्टाइल कास्ट का उपयोग कर सकते हैं, यह वह स्थिति है जो इसे C में संकलित करेगा, लेकिन अधिकांश C ++ कोडिंग मानकों से और कई सी प्रोग्रामर द्वारा भी चौंक जाएगा, "स्टैक ओवरफ्लो पर टिप्पणी" मॉलकोक न करें " ।
वे समान भाषा नहीं हैं, और यदि आपके पास C में कोई मौजूदा प्रोजेक्ट है तो आप इसे केवल लाइब्रेरी का उपयोग करने के लिए एक अलग भाषा में फिर से लिखना नहीं चाहते हैं। आप उन पुस्तकालयों का उपयोग करना पसंद करेंगे जिन्हें आप जिस भाषा में काम कर रहे हैं, उसमें इंटरफ़ेस कर सकते हैं। (कुछ मामलों में यह कुछ extern "C"
रैपर फ़ंक्शन के साथ संभव है, यह इस बात पर निर्भर करता है कि टेम्पलेट + इनलाइन C ++ लाइब्रेरी कैसे है।)
एक परियोजना मैं पर काम कर रहा हूँ में पहली सी फ़ाइल ले रहा है, तो ऐसा होता है अगर तुम सिर्फ अदला-बदली gcc std=c99
के लिए g++
:
sandiego:$ g++ -g -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3 -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the ‘z’ printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from ‘void*’ to ‘kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter ‘restrict’
..
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
त्रुटियों की कुल 69 लाइनों में, जिनमें से चार अमान्य रूपांतरण हैं, लेकिन ज्यादातर उन विशेषताओं के लिए हैं जो C99 में मौजूद हैं लेकिन C ++ में नहीं।
ऐसा नहीं है कि मैं इसके लिए उन सुविधाओं का उपयोग कर रहा हूं। इसे एक अलग भाषा में पोर्ट करने के लिए महत्वपूर्ण काम होगा।
इसलिए यह सुझाव देना गलत है
[ए] सी कंपाइलर लगभग निश्चित रूप से वास्तव में एक सी ++ कंपाइलर है, इसलिए कोई सॉफ्टवेयर लागत निहितार्थ नहीं हैं
मौजूदा C कोड को C ++ के प्रक्रियात्मक सबसेट में पोर्ट करने में अक्सर महत्वपूर्ण लागत निहितार्थ होते हैं।
इसलिए 'C उद्देश्य का उपयोग करने के लिए C' में एक पुस्तकालय कार्यान्वयन की तलाश में प्रश्न के उत्तर के रूप में 'C ++ std :: queue class' का उपयोग करने का सुझाव देने के बाद 'JNI का उपयोग करके' java.util.Que क्लास को जावा java.util.Queure वर्ग कहने का सुझाव दिया गया है । या 'कॉल द सीपीथॉन लाइब्रेरी' - ऑब्जेक्टिव C वास्तव में C (C99 सहित) का एक उचित सुपरसेट है, और Java और CPython लाइब्रेरी दोनों सी से सीधे कॉल करने योग्य हैं, बिना संबंधित कोड को C ++ भाषा में पोर्ट किए बिना।
बेशक आप C ++ लाइब्रेरी को C façade सप्लाई कर सकते हैं, लेकिन एक बार जब आप कर रहे हैं कि C ++ जावा या पायथन से अलग नहीं है।