CC, gcc और g ++ के बीच अंतर?


105

असेंबली कोड जनरेशन, उपलब्ध लाइब्रेरी, लैंग्वेज फीचर्स आदि के संदर्भ में C और C ++ कोड को कंपाइल करते समय 3 कंपाइलर CC, gcc, g ++ में क्या अंतर हैं?


1
जैसा कि मेरे उत्तर में इंगित किया गया है - आपके प्रश्न का उत्तर प्लेटफ़ॉर्म पर निर्भर करता है, लेकिन प्लेटफ़ॉर्म निर्दिष्ट नहीं है।
जोनाथन लेफ़लर

जवाबों:


123

इसका उत्तर प्लेटफ़ॉर्म-विशिष्ट है; उदाहरण के लिए, लिनक्स पर जो होता है वह सोलारिस पर होता है।

आसान हिस्सा (क्योंकि यह प्लेटफ़ॉर्म-विशिष्ट नहीं है) 'gcc' और 'g ++' का पृथक्करण है:

  • gcc जीसीसी (GNU कम्पाइलर कलेक्शन) से GNU C कम्पाइलर है।
  • जी ++ जीसीसी से जीएनयू सी ++ कंपाइलर है।

कठिन हिस्सा, क्योंकि यह प्लेटफ़ॉर्म-विशिष्ट है, 'CC' (और 'cc') का अर्थ है।

  • सोलारिस पर, CC सामान्यतः सूर्य C ++ कंपाइलर का नाम है।
  • सोलारिस पर, सीसी सामान्य रूप से सन सी कंपाइलर का नाम है।
  • लिनक्स पर, यदि यह मौजूद है, तो CC शायद g ++ का लिंक है।
  • लिनक्स पर, cc gcc का लिंक है।

हालाँकि, सोलारिस पर भी, यह हो सकता है कि cc पुराना BSD- आधारित C ​​कंपाइलर है /usr/ucb । व्यवहार में, कि आमतौर पर स्थापित नहीं है और बस एक ठूंठ है जो विफल रहता है, उन लोगों पर कहर बरपाता है जो स्वयं-कॉन्फ़िगर सॉफ़्टवेयर को संकलित करने और स्थापित करने का प्रयास करते हैं।

HP-UX पर, डिफ़ॉल्ट 'cc' अभी भी एक K & R-C C कंपाइलर है जो आवश्यक होने पर कर्नेल को हटाने की अनुमति देने के लिए स्थापित किया गया है, और आधुनिक सॉफ़्टवेयर कार्य के लिए अनुपयोगी है क्योंकि यह मानक C का समर्थन नहीं करता है। आपको वैकल्पिक संकलक नामों का उपयोग करना होगा ('एसीसी' IIRC)। इसी तरह, AIX पर, सिस्टम C कंपाइलर 'xlc' या 'xlc32' जैसे नामों से जाता है।

शास्त्रीय रूप से, डिफ़ॉल्ट सिस्टम कंपाइलर को 'cc' कहा जाता था और सेल्फ-कॉन्फिगरिंग सॉफ्टवेयर उस नाम पर वापस आ जाता है, जब उसे पता नहीं होता है कि उसे और क्या उपयोग करना है।

POSIX ने प्रोग्राम को c89 (मूल रूप से) और बाद में c99 के अस्तित्व में लाने की आवश्यकता के द्वारा इसके चारों ओर अपना रास्ता बनाने का प्रयास किया; ये ISO / IEC 9899: 1989 और 9899: 1999 C मानकों के अनुरूप हैं। यह संदिग्ध है कि POSIX सफल रहा।


सवाल सुविधाओं और पुस्तकालयों के संदर्भ में अंतर के बारे में पूछता है। पहले की तरह, उत्तर भाग में विशिष्ट मंच है, और भाग में सामान्य है।

बड़ा डिवाइड C कंपाइलर और C ++ कंपाइलर के बीच होता है। C ++ कंपाइलर C ++ प्रोग्राम को स्वीकार करेगा और मनमाने C प्रोग्राम को कंपाइल नहीं करेगा। (हालांकि सी को एक सबसेट में लिखना संभव है जिसे सी ++ द्वारा भी समझा जाता है, कई सी प्रोग्राम मान्य सी ++ प्रोग्राम नहीं हैं)। इसी तरह, सी कंपाइलर सी प्रोग्राम स्वीकार करेंगे और अधिकांश सी ++ प्रोग्राम को अस्वीकार कर देंगे (क्योंकि अधिकांश सी ++ प्रोग्राम कंस्ट्रक्शन का उपयोग सी में उपलब्ध नहीं हैं)।

उपयोग के लिए उपलब्ध पुस्तकालयों का सेट भाषा पर निर्भर करता है। सी ++ प्रोग्राम आमतौर पर किसी दिए गए प्लेटफ़ॉर्म पर सी लाइब्रेरीज़ का उपयोग कर सकते हैं; C प्रोग्राम आमतौर पर C ++ लाइब्रेरीज़ का उपयोग नहीं कर सकते हैं। इसलिए, C ++ में पुस्तकालयों का एक बड़ा सेट उपलब्ध है।

ध्यान दें कि यदि आप सोलारिस पर हैं, तो CC द्वारा निर्मित ऑब्जेक्ट कोड g ++ द्वारा निर्मित ऑब्जेक्ट कोड के साथ संगत नहीं है - वे दो अलग-अलग संकलक हैं, जैसे अपवाद हैंडलिंग और नाम मैन्नेलिंग (और नाम प्रबंधन) जानबूझकर चीजों के लिए अलग-अलग सम्मेलनों के साथ हैं। यह सुनिश्चित करने के लिए अलग है कि असंगत वस्तु फाइलें एक साथ जुड़ी नहीं हैं!)। इसका मतलब है कि यदि आप CC के साथ संकलित लाइब्रेरी का उपयोग करना चाहते हैं, तो आपको अपने पूरे प्रोग्राम को CC के साथ संकलित करना होगा। इसका यह भी अर्थ है कि यदि आप CC के साथ संकलित एक लाइब्रेरी का उपयोग करना चाहते हैं और g ++ के साथ अन्य संकलित हैं, तो आप भाग्य से बाहर हैं। आपको पुस्तकालयों में से किसी एक को कम से कम recompile करना होगा।

असेम्बलर की गुणवत्ता के संदर्भ में, GCC (GNU कम्पाइलर कलेक्शन) बहुत अच्छा काम करता है। लेकिन कभी-कभी देशी कंपाइलर थोड़ा बेहतर काम करते हैं। इंटेल कंपाइलरों में अधिक व्यापक अनुकूलन हैं जिन्हें अभी तक जीसीसी में दोहराया नहीं गया है, मेरा मानना ​​है। लेकिन इस तरह के किसी भी असंतोष खतरनाक हैं, जबकि हम नहीं जानते कि आप किस मंच से चिंतित हैं।

भाषा सुविधाओं के संदर्भ में, कंपाइलर आमतौर पर वर्तमान मानकों (C ++ 98, C ++ 2003, C99) के काफी करीब हैं, लेकिन आमतौर पर मानक भाषा और संकलक द्वारा समर्थित भाषा के बीच छोटे अंतर होते हैं। पुराने C89 मानक समर्थन अनिवार्य रूप से सभी C कंपाइलरों के लिए समान (और पूर्ण) हैं। भाषा के गहरे कोनों में अंतर हैं। आपको 'अपरिभाषित व्यवहार', 'प्रणाली परिभाषित व्यवहार' और 'अनिर्दिष्ट व्यवहार' को समझने की आवश्यकता है; यदि आप अपरिभाषित व्यवहार करते हैं, तो आपको अलग-अलग समय पर अलग-अलग परिणाम मिलेंगे। संकलक के व्यवहार को मोड़ने के लिए कई विकल्प (विशेष रूप से जीसीसी के साथ) हैं। जीसीसी में कई प्रकार के एक्सटेंशन हैं जो जीवन को सरल बनाते हैं यदि आप जानते हैं कि आप केवल उस कंपाइलर परिवार को लक्षित कर रहे हैं।


1
और OSX (सिएरा 10.2 कम से कम) पर, यह क्लैंग के लिए एक सहानुभूति है।
जोश कोड्रॉफ

26

CCएक पर्यावरण चर है जो सिस्टम के C कंपाइलर का जिक्र करता है। यह (पुस्तकालयों के लिए सुलभ, आदि) की ओर इशारा करता है। अक्सर यह इंगित करेगा /usr/bin/cc, वास्तविक सी अनिवार्य (चालक)। लिनक्स प्लेटफार्मों पर, CCलगभग हमेशा इंगित करता है /usr/bin/gcc

gccGNU संकलक संग्रह के लिए ड्राइवर बाइनरी है। यह C, C ++ और संभवतः अन्य भाषाओं को संकलित कर सकता है; यह फ़ाइल एक्सटेंशन द्वारा भाषा को निर्धारित करता है।

g++एक ड्राइवर बाइनरी है gcc, लेकिन C ++ को संकलित करने के लिए कुछ विशेष विकल्पों के साथ। विशेष रूप से (मेरे अनुभव में), g++डिफ़ॉल्ट रूप से libstdc ++ को लिंक करेगा, जबकि gccऐसा नहीं होगा।


1
क्या आप कृपया समझा सकते हैं कि "ड्राइवर बाइनरी" से आपका क्या मतलब है?
एडन मौर

5
अधिकांश सी संकलक, लेकिन जीसीसी विशेष रूप से, कई कार्यक्रम हैं जो संकलन कार्य करते हैं। एक शीर्ष-स्तरीय कार्यक्रम है, जिसे 'gcc' कहा जाता है, जो संकलक चालक है; यह एक असंख्य कमांड लाइन विकल्प देता है और कंपाइलर के अन्य चरणों को ऑर्केस्ट्रेट करता है - पार्सर / विश्लेषक, आशावादी, कोडांतरक और लिंकर, आमतौर पर (प्रीप्रोसेसर आमतौर पर इन दिनों एक अलग चरण नहीं है, जब तक कि आप केवल प्रीप्रोसेसिंग का अनुरोध न करें)। यह (कंपाइलर ड्राइवर) काफी जटिल प्रोग्राम है, भले ही यह कभी भी सी सोर्स फाइल को न छूता हो।
जोनाथन लेफ़लर

3
CC सूर्य C ++ संकलक भी है - और एक पर्यावरण चर नहीं है।
जोनाथन लेफ्लर

1
SGI का C ++ कंपाइलर भी CC है।
एलेक्स टिंगल

खैर, मुझे लगता है कि मनुगू सोच रहा है कि ./configure+ इस्तेमाल किए गए सी कंपाइलर को प्रभावित करने के makeलिए एक पर्यावरण चर नाम CCले सकता है, लेकिन अन्यथा उस नाम से आम तौर पर एक पर्यावरण चर नहीं है।

6

मैं लिनक्स में cc क्या सिर्फ एक जानकारी जोड़ना चाहता हूँ। यह gcc से जुड़ा हुआ है। इसकी जांच करना। यहां छवि विवरण दर्ज करें

इसी तरह, सी ++ के साथ भी यही बात है।

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.