एक एम्बेडेड परियोजना पर काम करना, मैंने एक बार सभी सी में काम करने की कोशिश की, और बस इसे खड़ा नहीं कर सका। यह सिर्फ इतना था कि यह कुछ भी पढ़ने के लिए कठिन बना दिया। इसके अलावा, मुझे अपने द्वारा लिखे गए अनुकूलित कंटेनरों के लिए पसंद आया, जिन्हें ठीक करने के लिए बहुत कम सुरक्षित और कठिन में बदलना पड़ा#define ब्लॉकों ।
C ++ में कोड जैसा दिखता था:
if(uart[0]->Send(pktQueue.Top(), sizeof(Packet)))
pktQueue.Dequeue(1);
में बदल जाता है:
if(UART_uchar_SendBlock(uart[0], Queue_Packet_Top(pktQueue), sizeof(Packet)))
Queue_Packet_Dequeue(pktQueue, 1)
जो बहुत से लोग शायद कहेंगे कि ठीक है, लेकिन हास्यास्पद हो जाता है यदि आपको एक पंक्ति में एक जोड़े "विधि" से अधिक कॉल करना पड़ता है। C ++ की दो लाइनें C के पांच में बदल जाती हैं (80-चार लाइन की लंबाई सीमा के कारण)। दोनों एक ही कोड जेनरेट करेंगे, इसलिए यह ध्यान रखने वाले लक्ष्य प्रोसेसर की तरह नहीं है!
एक समय (1995 में वापस), मैंने एक मल्टीप्रोसेसर डेटा-प्रोसेसिंग प्रोग्राम के लिए बहुत सी लिखने की कोशिश की। वह प्रकार जहाँ प्रत्येक प्रोसेसर की अपनी मेमोरी और प्रोग्राम होता है। विक्रेता द्वारा आपूर्ति किया गया कंपाइलर एक सी कंपाइलर (किसी तरह का हाईसी डेरिवेटिव) था, उनके पुस्तकालयों को स्रोत बंद कर दिया गया था ताकि मैं GCC के निर्माण के लिए उपयोग न कर सकूं और उनके API को इस मानसिकता के साथ डिजाइन किया गया कि आपके कार्यक्रम मुख्य रूप से इनिशियलाइज़ / प्रोसेस होंगे। / समाप्ति की विविधता, इसलिए अंतर-प्रोसेसर संचार सबसे अच्छा था।
मुझे देने से पहले मुझे लगभग एक महीने का समय मिला, मैंने cfront की एक प्रति पाई , और इसे मेकफ़ाइल्स में हैक कर लिया ताकि मैं अन्य ++ का उपयोग कर सकूं । Cfront ने भी टेम्पलेट्स का समर्थन नहीं किया, लेकिन C ++ कोड बहुत अधिक स्पष्ट था।
सामान्य, प्रकार-सुरक्षित डेटा संरचनाएं (टेम्प्लेट का उपयोग करके)।
C को टेम्प्लेट करने के लिए सबसे पास की चीज़ है, बहुत सी कोड वाली हेडर फ़ाइल की घोषणा करना जो दिखता है:
TYPE * Queue_##TYPE##_Top(Queue_##TYPE##* const this)
{ }
फिर इसे कुछ इस तरह से खींचें:
#define TYPE Packet
#include "Queue.h"
#undef TYPE
ध्यान दें कि यह यौगिक प्रकारों (जैसे कोई कतार नहीं unsigned char) के लिए काम नहीं करेगा जब तक कि आप typedefपहले न करें।
ओह, और याद रखें, यदि यह कोड वास्तव में कहीं भी उपयोग नहीं किया गया है, तो आपको यह भी नहीं पता है कि क्या यह वाक्यविन्यास रूप से सही है।
संपादित करें: एक और बात: आपको कोड की तात्कालिकता को मैन्युअल रूप से प्रबंधित करने की आवश्यकता होगी । यदि आपका "टेम्प्लेट" कोड सभी इनलाइन फ़ंक्शन नहीं है, तो आपको यह सुनिश्चित करने के लिए कुछ नियंत्रण में रखना होगा कि चीजें केवल एक बार मिलती हैं ताकि आपका लिंकर "फू के कई उदाहरण" त्रुटियों के ढेर से बाहर न निकले। ।
ऐसा करने के लिए, आपको अपनी शीर्षक फ़ाइल में "कार्यान्वयन" अनुभाग में गैर-इनलाइन किया गया सामान रखना होगा:
#ifdef implementation_##TYPE
#endif
और फिर, आपके सभी कोड प्रति टेम्पलेट वैरिएंट में एक स्थान पर , आपको निम्न करना होगा:
#define TYPE Packet
#define implementation_Packet
#include "Queue.h"
#undef TYPE
इसके अलावा, इस कार्यान्वयन अनुभाग को मानक / / लिटनी के बाहर होना चाहिए , क्योंकि आप किसी अन्य हेडर फ़ाइल में टेम्प्लेट हेडर फ़ाइल को शामिल कर सकते हैं, लेकिन बाद में किसी फ़ाइल में तत्काल करने की आवश्यकता है ।#ifndef#define#endif.c
हाँ, यह बदसूरत तेज़ हो जाता है। यही कारण है कि ज्यादातर सी प्रोग्रामर भी कोशिश नहीं करते हैं।
आरए II।
विशेष रूप से कई वापसी बिंदुओं वाले कार्यों में, उदाहरण के लिए प्रत्येक वापसी बिंदु पर म्यूटेक्स जारी करने के लिए याद नहीं रखना।
ठीक है, अपने सुंदर कोड को भूल जाइए और अपने सभी रिटर्न पॉइंट (फंक्शन के अंत को छोड़कर) के लिए उपयोग हो gotoजाइए:
TYPE * Queue_##TYPE##_Top(Queue_##TYPE##* const this)
{
TYPE * result;
Mutex_Lock(this->lock);
if(this->head == this->tail)
{
result = 0;
goto Queue_##TYPE##_Top_exit:;
}
Queue_##TYPE##_Top_exit:
Mutex_Lock(this->lock);
return result;
}
सामान्य रूप से विनाशकारी।
यानी आप MyClass के लिए एक बार एक D'tor लिखते हैं, तो यदि MyClass का एक उदाहरण MyOtherClass का सदस्य है, MyOtherClass को MyClass उदाहरण को स्पष्ट रूप से विचलित नहीं करना है - इसके d'tor को स्वचालित रूप से कहा जाता है।
ऑब्जेक्ट निर्माण को उसी तरह से स्पष्ट रूप से नियंत्रित किया जाना है।
नेमस्पेस।
यह वास्तव में एक को ठीक करने के लिए एक सरल है: बस हर प्रतीक पर एक उपसर्ग से निपटने। यह स्रोत ब्लोट का प्राथमिक कारण है जो मैंने पहले के बारे में बात की थी (क्योंकि कक्षाएं निहित नामस्थान हैं)। सी लोग इस, अच्छी तरह से, हमेशा के लिए रह रहे हैं, और शायद यह नहीं देखेंगे कि बड़ी बात क्या है।
YMMV