2010-02-19 15 views
9

क्या सी में कोई अंतर है जो विंडोज और यूनिक्स में लिखा गया है?
मैं सी के साथ-साथ सी ++ सिखाता हूं लेकिन मेरे कुछ छात्र वापस आ गए हैं कि कुछ नमूना कार्यक्रम यूनिक्स में उनके लिए नहीं चलते हैं। यूनिक्स मेरे लिए विदेशी है। दुर्भाग्य से इसके साथ कोई अनुभव नहीं है। मुझे पता है कि यह जादू करना है। यदि कोई अंतर है तो मुझे अपने विभाग को यूनिक्स के लिए सिस्टम पर निवेश करने की सलाह देनी चाहिए क्योंकि वर्तमान में हमारे प्रयोगशाला में यूनिक्स सिस्टम नहीं हैं। मैं नहीं चाहता कि मेरे छात्रों को यह महसूस हो कि उन्हें अस्वीकार कर दिया गया है या किसी चीज़ से दूर रखा गया है।सी प्रोग्राम विंडोज और यूनिक्स ओएस पर क्रॉस प्लेटफॉर्म अंतर

+2

शायद आप कुछ धारणाएं कर रहे हैं जिन्हें सी मानक के अनुसार सत्य होने की गारंटी नहीं है, लेकिन विंडोज वातावरण में सच हैं। यदि आप कर सकते हैं, तो कृपया एक छोटा प्रोग्राम पोस्ट करें जो इस व्यवहार को दिखाता है। यदि आप इसे खरीदने का जोखिम नहीं उठा सकते हैं तो आपको सी मानक, या मसौदा संस्करण भी पढ़ना चाहिए: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf (यह है सी 99 के लिए)। –

+5

आपकी प्रयोगशाला में कोई यूनिक्स सिस्टम नहीं है? वाह। कुछ लिनक्स बॉक्स स्थापित करना कितना मुश्किल होगा? –

+0

एक साधारण उदाहरण '# शामिल करें '। वह फ़ाइल यूनिक्स में मौजूद नहीं है। वैसे भी बहुत अंतर हैं और एक विस्तृत सूची संभव नहीं हो सकती है। –

उत्तर

15

ऐसी समस्याएं आमतौर पर तब दिखाई देती हैं जब आप नंगे सी मानक से चिपके रहते हैं, और पर्यावरण के बारे में धारणाएं बनाते हैं जो सच नहीं हो सकते हैं। इन पर निर्भरता शामिल हो सकते हैं:

  • गैरमानक, मंच विशिष्ट भी शामिल है (<conio.h>, <windows.h>, <unistd.h>, ...);
  • अपरिभाषित व्यवहार (fflush(stdin), जैसा कि किसी और ने बताया है, मानक द्वारा कुछ भी करने की आवश्यकता नहीं है - यह वास्तव में अपरिभाषित व्यवहार है, जो fflush को किसी भी चीज़ पर आउटपुट स्ट्रीम के लिए आमंत्रित करता है; सामान्य रूप से, पुराने कंपाइलर कुछ सूक्ष्म नियमों का उल्लंघन करने के बारे में अधिक उदार थे जैसे सख्त एलियासिंग, इसलिए "चालाक" सूचक चाल से सावधान रहें);
  • डेटा प्रकार का आकार (short = 16 बिट, int = long = 32 बिट धारणा हर जगह नहीं रखती है - उदाहरण के लिए 64 बिट लिनक्स 64 बिट long है);
  • विशेष रूप से, सूचक आकार (void * हमेशा 32 बिट नहीं होता है, और हमेशा unsigned long पर सुरक्षित रूप से नहीं डाला जा सकता है); सामान्य रूप में आप रूपांतरण और तुलना कि संकेत को शामिल के साथ सावधान रहना चाहिए, और आप हमेशा "सामान्य" int रों के बजाय कार्यों के उस तरह के लिए प्रदान प्रकार का उपयोग करना चाहिए
  • डेटा प्रकार (विशेष रूप से size_t, ptrdiff_t, uintptr_t में देखें) " आंतरिक प्रारूप "(मानक यह नहीं कहता है कि float एस और double एस आईईईई 754 में हैं, हालांकि मैंने प्लेटफॉर्म को अलग-अलग नहीं देखा है);
  • गैरमानक कार्य (__beginthread, एमएस सुरक्षित तार कार्य; दूसरी तरफ, POSIX/जीएनयू एक्सटेंशन)
  • संकलक एक्सटेंशन (__inline, __declspec, #pragma रों, ...) और सामान्य कुछ भी है कि डबल अंडरस्कोर के साथ शुरू होता है में (या यहां तक ​​कि पुराने, गैर-मानक कार्यान्वयन में, एक अंडरस्कोर के साथ भी);
  • कंसोल से बचने के कोड (यह आमतौर पर एक समस्या है जब आप विंडोज पर यूनिक्स कोड चलाने की कोशिश करते हैं);
  • गाड़ी वापसी प्रारूप: सामान्य तार में यह \n हर जगह है, लेकिन जब फ़ाइल पर लिखा यह * NIX, \r\n विंडोज, \r पर पहले से OSX Macs पर पर \n है; रूपांतरण को फ़ाइल धाराओं द्वारा स्वचालित रूप से संभाला जाता है, इसलिए बाइनरी में फ़ाइलों को खोलने के लिए सावधान रहें, जब आप वास्तव में बाइनरी डेटा लिखना चाहते हैं, और जब आप टेक्स्ट लिखना चाहते हैं तो उन्हें टेक्स्ट मोड में छोड़ दें।

किसी भी तरह से प्रोग्राम का एक उदाहरण जो * NIX पर संकलित नहीं होता है, सहायक होगा, हम आपको सटीक सुझाव दे सकते हैं।

कार्यक्रम पर विवरण अभी तक प्राप्त नहीं हुआ है। छात्र हमारे पिछले बैच से थे। इसके लिए पूछो टर्बो सी वर्तमान में क्या उपयोग किया जा रहा है।

के रूप में टिप्पणी में कहा, कृपया ड्रॉप टर्बो सी और (यदि आप इसका इस्तेमाल करते हैं) टर्बो सी ++, आजकल वे इतिहास के दोनों टुकड़े कर रहे हैं और वर्तमान C और C++ मानकों के साथ कई असंगतियां है (और अगर मैं अच्छी तरह से याद है वे दोनों 16-बिट निष्पादन योग्य उत्पन्न करते हैं, जो x86_64 पर 64 बिट ओएस पर भी नहीं चलेंगे)।

बहुत सारे मुफ्त, काम करने वाले और मानक-अनुरूप विकल्प (वीसी ++ एक्सप्रेस, मिनजीडब्ल्यू, पेल्स सी, विंडोज पर साइगविन, और जीसीसी/जी ++ लिनक्स पर डी-फैक्टो मानक है, जो क्लैंग द्वारा प्रतिद्वंद्वी है), आप बस एक चुनना है।

+1

+1। वे आपको मानक सी लिखने की अनुमति देंगे जो किसी भी * निक्स और मैक ओएसएक्स पर संकलित होगा। आईएमओ जाने का रास्ता है। –

+0

उनके साथ समस्या यह है कि साइगविन को अपने रनटाइम की आवश्यकता है, और आखिरकार यह यूनिक्स संगतता परत है, इसलिए मैं इसे देशी परियोजनाओं के लिए अनुशंसा नहीं करता। दूसरी तरफ, मिनजीडब्ल्यू, देशी, "सामान्य" विंडोज एक्सईएस आउटपुट करता है। हालांकि, कम से कम जब मैंने कोशिश की, तो यह वीसी ++ से अधिक और लिनक्स पर जीसीसी/जी ++ की तुलना में अधिक अनुकूलन प्रतीत होता था, और यह माइक्रोसॉफ्ट से "सामान्य" प्लेटफार्म एसडीके का उपयोग नहीं कर सकता है, और मुझे यह बहुत पसंद नहीं है। इसलिए, मैं विंडोज़ पर वीसी ++ और लिनक्स पर जी ++/जीसीसी का उपयोग करता हूं; यह आपके आवेदन को दो अलग-अलग कंपाइलरों के साथ संकलित करने के लिए भी उपयोगी है, आप ऊपर वर्णित समस्याओं को तुरंत पकड़ते हैं। –

+0

दरअसल, साइगविन आपको सिग्विन लाइब्रेरी की आवश्यकता के बिना निष्पादन योग्य बनाने की अनुमति देता है, ताकि टिप्पणी वास्तव में बहुत मान्य न हो। (स्मृति से, यह हैमिंगव, -msys या -no-cygwin या उन पंक्तियों के साथ कुछ अन्य विकल्प)। हालांकि, आप सही हैं कि जीसीसी अन्य कंपेलरों के रूप में इष्टतम परिणामों के रूप में उत्पादन नहीं करता है - जीसीसी, हालांकि, कई आर्किटेक्चर और प्लेटफॉर्म पर भारी रूप से पोर्ट किया गया है, जो एक बड़ा फायदा है। – Arafangion

1

विंडोज या * निक्स के तहत सी प्रोग्रामिंग भाषा के बीच कोई अंतर नहीं होना चाहिए, क्योंकि भाषा आईएसओ मानक द्वारा निर्दिष्ट है।

2

सी सिंटैक्स समान होना चाहिए यदि दोनों विंडोज और यूनिक्स कंपाइलर एक ही सी मानक का पालन करते हैं। मुझे बताया गया था कि एमएस कंपाइलर्स अभी भी पूरी तरह से सी 99 का समर्थन नहीं करते हैं, हालांकि यूनिक्स कंपाइलर्स गति से ऊपर हैं, इसलिए ऐसा लगता है कि सी 8 9 सबसे कम आम संप्रदाय है।

हालांकि यूनिक्स दुनिया में आप आम तौर पर आईपीसी जैसे सिस्टम सामान करने के लिए पॉज़िक्स सिस्कोल का उपयोग करेंगे। विंडोज पॉज़िक्स सिस्टम नहीं है, इसलिए इसके लिए अलग-अलग एपीआई है।

10

भाषा समान है, लेकिन लाइब्रेरी कुछ भी प्लेटफ़ॉर्म-विशिष्ट प्राप्त करने के लिए उपयोग की जाती हैं। लेकिन अगर आप सी (और सिस्टम प्रोग्रामिंग नहीं) पढ़ रहे हैं तो आपको आसानी से पोर्टेबल कोड लिखने में सक्षम होना चाहिए। तथ्य यह है कि आप ऐसा नहीं कर रहे हैं जिससे मुझे आपकी प्रशिक्षण सामग्री की गुणवत्ता के बारे में आश्चर्य हो जाता है।

0

एक आम समस्या यह है कि fflush(stdin) यूनिक्स पर काम नहीं करता है। जो पूरी तरह सामान्य है, क्योंकि मानक परिभाषित नहीं करता है कि कार्यान्वयन को इसे कैसे संभालना चाहिए। समाधान इस (untested) की तरह कुछ का उपयोग करने के लिए है:

do 
{ 
    int c = getchar(); 
} 
while (c != '\n' && c != EOF); 

इसी तरह, आप कुछ भी है कि अपरिभाषित व्यवहार का कारण बनता है से बचने के लिए की जरूरत है।

1

सी भाषा स्वयं विंडोज से यूनिक्स तक पोर्टेबल है। लेकिन ऑपरेटिंग सिस्टम का विवरण अलग-अलग होता है और कभी-कभी वे आपके कोड में घुसपैठ करते हैं।

उदाहरण के लिए यूनिक्स सिस्टम आमतौर पर टेक्स्ट फ़ाइल में लाइनों को अलग करने के लिए केवल "\ n" का उपयोग करते हैं, जबकि अधिकांश विंडोज टूल्स "\ r \ n" को देखने की उम्मीद करते हैं। इस तरह के अंतर से निपटने के तरीके हैं जो सी रनटाइम को आपके लिए संभालने के लिए प्राप्त करते हैं, लेकिन यदि आप सावधान नहीं हैं तो आप उनके बारे में जानते हैं, ओएस विशिष्ट सी कोड लिखना बहुत आसान है।

मैं यह कर सकता हूं कि आप वर्चुअल मशीन में यूनिक्स चलाएं और इसे अपने छात्रों के साथ साझा करने से पहले अपने कोड का परीक्षण करने के लिए इसका उपयोग करें।

1

मुझे लगता है कि यह महत्वपूर्ण है कि आप अपने आप को यूनिक्स के साथ परिचित करें।

ऐसा करने का एक शानदार तरीका Knoppix सीडी के साथ है।

जीसी का उपयोग करके लिनक्स के तहत अपने प्रोग्राम को संकलित करने का प्रयास करें, और जब वे काम नहीं करते हैं, तो समस्याओं को ट्रैक करें (#in38e < विंडोज >?) और इसे काम करें। फिर विंडोज़ पर वापस आएं, और यह ठीक से संकलित होगा।

इस तरह, आप विंडोज़ मशीनों पर प्रयोगशाला अभ्यास के लिए भी अपने कार्यक्रम क्लीनर और बेहतर शिक्षण सामग्री बन जाएंगे।

4

मानक पुस्तकालय जो एमएसवीसी के साथ शिप करते हैं और जो सामान्य लिनक्स या यूनिक्स कंपाइलर के साथ शिप करते हैं, वे काफी भिन्न हैं कि आपको संगतता के मुद्दों का सामना करना पड़ सकता है। एमएसवीसी और जीसीसी के बीच मामूली बोलीभाषा भिन्नता भी हो सकती है।

यूनिक्स जैसी वातावरण में अपने उदाहरणों का परीक्षण करने का सबसे आसान तरीका आपके मौजूदा विंडोज किट पर सिगविन या एमएसवाईएस स्थापित करना होगा। ये जीसीसी और आम ओपन-सोर्स लाइब्रेरी पर आधारित हैं और यूनिक्स या लिनक्स सिस्टम पर सी कंपाइलर पर्यावरण की तरह अधिक व्यवहार करेंगे।

  • Cygwin सबसे 'की तरह यूनिक्स' है, और एक cygwin.dll है, जो एक अनुकरण परत है कि यूनिक्स प्रणाली emulates है देशी Win32 एपीआई के शीर्ष पर कॉल पर आधारित है। सिग्विन पर संकलन करने वाली आम तौर पर कुछ भी लिनक्स पर संकलन करने की संभावना है, क्योंकि सिगविन जीसीसी और ग्लिब पर आधारित है। हालांकि, मूल Win32 एपीआई सिगविन पर संकलित अनुप्रयोगों के लिए उपलब्ध नहीं हैं।

  • एमएसवाईएस/मिनजीडब्ल्यू 32 जीसीसी का उपयोग कर देशी Win32 ऐप्स बनाने के लिए डिज़ाइन किया गया है। हालांकि, अधिकांश मानक जीएनयू और अन्य ओएसएस पुस्तकालय उपलब्ध हैं, इसलिए यह वीसी की तुलना में एक यूनिक्स पर्यावरण की तरह व्यवहार करता है। वास्तव में, यदि आप कोड के साथ काम कर रहे हैं जो Win32 या यूनिक्स विशिष्ट API का उपयोग नहीं करता है तो यह संभवतः MinGW32 और Linux के बीच MinGW32 और Linux के बीच पोर्ट की तुलना में अधिक आसानी से पोर्ट होगा।

हो रही लिनक्स अपने प्रयोगशाला में स्थापित करते समय शायद एक उपयोगी चीज करने के लिए (प्रयोग VMWare खिलाड़ी या कुछ अन्य हाइपरविजर अगर आप नए सर्वर के लिए धन नहीं मिल सकता है) आप प्राप्त करने के लिए ऊपर toolchains दोनों में से किसी का उपयोग कर सकते है कुछ ऐसा जो आपके उद्देश्यों के लिए शायद 'पर्याप्त निकट' होगा। आप यूनिक्स को अपनी कल्पना के रूप में सीख सकते हैं, और सिग्विन और एमएसवाईएस दोनों आपको एक यूनिक्स जैसी वातावरण देंगे जो इस दौरान आपको एक सौम्य परिचय दे सकता है।

2

इस बात को Ansi C कहा जाता है। जब तक आप पूरी तरह से Ansi सी कोड, जब कोई फर्क नहीं पड़ता है। हालांकि, यह एक बल्कि अकादमिक धारणा है।

वास्तविक जीवन में, मैंने कभी भी मेरे किसी भी कोड को लिनक्स से विंडोज तक पोर्टेबल नहीं किया है और इसके विपरीत बिना किसी संशोधन के। असल में, यह संशोधन एस (निश्चित रूप से बहुवचन) प्री-प्रोसेसर निर्देशों, जैसे कि #ifdef WINDOWS ... #endif और #ifdef UNIX ... #endif ... के साथ-साथ कुछ समानांतर libs, जैसे OPENMPI का उपयोग किया गया था, के विशाल परिवेश में निकला।

आप कल्पना कर सकते हैं, यह पूरी तरह से पठनीय और debugable कोड के विपरीत है, लेकिन यह है कि क्या काम किया ;-)

इसके अलावा, आप चीजों को पहले ही उल्लेख किया विचार करने के लिए मिल गया है था: UTF-8 कभी कभी linux बाहर दस्तक देगा कंपाइलर्स ...

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