এম্বেড থাকা প্রকল্পে কাজ করে, আমি একবারে সমস্ত সিতে কাজ করার চেষ্টা করেছি, এবং কেবল এটি দাঁড়াতে পারিনি। এটি ঠিক এতটা ভার্বোজ ছিল যে কোনও কিছু পড়তে অসুবিধা করেছিল। এছাড়াও, আমি লিখেছিলাম এমন অনুকূলিত-এমবেডেড পাত্রে পছন্দ করেছি, যা #defineব্লকগুলি ঠিক করতে খুব কম নিরাপদ এবং শক্ততে পরিণত হয়েছিল ।
সি ++ তে থাকা কোডটি এমন দেখাচ্ছে:
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)
যা সম্ভবত অনেকেই বলবেন ঠিক আছে তবে হাস্যকর হয়ে উঠলে আপনি যদি একটি লাইনে দু'বার "পদ্ধতি" কল করার চেয়ে বেশি কিছু করতে হয়। সি ++ এর দুটি লাইন পাঁচটি সি তে পরিণত হবে (80-চর লাইন দৈর্ঘ্যের সীমা কারণে)। উভয়ই একই কোড উত্পন্ন করবে, সুতরাং এটি লক্ষ্য প্রসেসরের যত্নের মতো নয়!
একবার (1995 সালে ফিরে), আমি একটি বহু-প্রসেসরের ডেটা-প্রসেসিং প্রোগ্রামের জন্য প্রচুর সি লেখার চেষ্টা করেছি। যে ধরণের প্রতিটি প্রসেসরের নিজস্ব মেমরি এবং প্রোগ্রাম রয়েছে। বিক্রেতার সরবরাহকৃত সংকলকটি একটি সি সংকলক (এক ধরণের হাইসি ডেরিভেটিভ) ছিল, তাদের লাইব্রেরিগুলি বন্ধ উত্স ছিল যাতে আমি জিসিসি তৈরি করতে পারি না, এবং তাদের এপিআইগুলি মানসিকতার সাথে ডিজাইন করা হয়েছিল যে আপনার প্রোগ্রামগুলি প্রাথমিকভাবে প্রারম্ভিক / প্রক্রিয়া হবে / বৈচিত্র্য সমাপ্তি, সুতরাং আন্তঃ-প্রসেসরের যোগাযোগ সর্বোত্তমভাবে প্রাথমিক ছিল।
আমি হাল ছাড়ার আগে প্রায় এক মাস পেলাম , সিফ্রন্টের একটি অনুলিপি পেয়েছি এবং এটি মেকফিলগুলিতে হ্যাক করেছি যাতে আমি সি ++ ব্যবহার করতে পারি। সিফ্রন্ট এমনকি টেমপ্লেটগুলি সমর্থন করে না, তবে সি ++ কোডটি ছিল অনেক বেশি পরিষ্কার।
জেনেরিক, টাইপ-সেফ ডেটা স্ট্রাকচার (টেমপ্লেট ব্যবহার করে)।
টেমপ্লেটগুলির নিকট সিটির নিকটতম জিনিসটি হ'ল প্রচুর কোড সহ শিরোনামের ফাইলটি ঘোষিত করা হয়:
TYPE * Queue_##TYPE##_Top(Queue_##TYPE##* const this)
{ }
তারপরে এটিকে এমন কিছু দিয়ে টানুন:
#define TYPE Packet
#include "Queue.h"
#undef TYPE
নোট করুন যে এটি যৌগিক ধরণের জন্য কাজ করবে না (উদাহরণস্বরূপ কোনও সারি নয় unsigned char) যদি আপনি typedefপ্রথমটি তৈরি না করেন।
ওহ, এবং মনে রাখবেন, যদি এই কোডটি আসলে কোথাও ব্যবহার না করা হয় তবে আপনি এটি জানেন না যে এটি সিনট্যাক্টিক্যালি সঠিক কিনা ically
সম্পাদনা: আরও একটি জিনিস: আপনাকে কোডের ম্যানুয়ালি ম্যানুয়ালি পরিচালনা করতে হবে । যদি আপনার "টেমপ্লেট" কোডটি সমস্ত ইনলাইন ফাংশন না করে থাকে তবে আপনার লিঙ্কারটি "ফু এর একাধিক উদাহরণ" ত্রুটির একটি স্তূপ বের করে না দেয় তাই জিনিসগুলি একবারে ইনস্ট্যান্ট হয়ে যায় তা নিশ্চিত করতে আপনাকে কিছুটা নিয়ন্ত্রণ রাখতে হবে have ।
এটি করতে, আপনাকে অ-ইনলাইনড স্টাফগুলি আপনার শিরোলেখ ফাইলটিতে একটি "বাস্তবায়ন" বিভাগে রাখতে হবে:
#ifdef implementation_##TYPE
#endif
এবং তারপরে, প্রতিটি টেম্পলেট ভেরিয়েন্টে আপনার সমস্ত কোডের এক জায়গায় , আপনাকে করতে হবে:
#define TYPE Packet
#define implementation_Packet
#include "Queue.h"
#undef TYPE
এছাড়াও, এই বাস্তবায়ন বিভাগটি স্ট্যান্ডার্ড / / লিটানির বাইরে হওয়া দরকার , কারণ আপনি টেমপ্লেট শিরোনাম ফাইলটিকে অন্য একটি শিরোনাম ফাইলে অন্তর্ভুক্ত করতে পারেন, তবে পরে কোনও ফাইলের মধ্যে ইনস্ট্যান্ট করতে হবে।#ifndef#define#endif.c
হ্যাঁ, এটি দ্রুত কুরুচিপূর্ণ হয়। যে কারণে বেশিরভাগ সি প্রোগ্রামাররা চেষ্টাও করে না।
আরআইআইআই
বিশেষত একাধিক রিটার্ন পয়েন্ট সহ ফাংশনগুলিতে, উদাহরণস্বরূপ প্রতিটি রিটার্ন পয়েন্টে মিটেক্সটি প্রকাশের কথা মনে রাখবেন না।
ঠিক আছে, আপনার সুন্দর কোডটি ভুলে যান এবং আপনার সমস্ত রিটার্ন পয়েন্টগুলি (ফাংশন শেষ না করে) এর হয়ে 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;
}
সাধারণভাবে ধ্বংসকারী
অর্থাৎ আপনি মাই ক্লাসের জন্য একবার ডিটার লিখেন, তারপরে যদি মাইক্লাস উদাহরণটি মাইথার ক্লাসের সদস্য হয় তবে মাইওথার ক্লাসটি মাইক্লাস উদাহরণটি স্পষ্টভাবে ডিনিটাইয়ালাইজ করতে হবে না - এর ডিটারটি স্বয়ংক্রিয়ভাবে ডাকা হয়।
অবজেক্ট কনস্ট্রাকশনটি স্পষ্টভাবে একইভাবে পরিচালনা করতে হবে।
নেমস্পেসেস
এটি ঠিক করার জন্য একটি সহজ একটি: প্রতিটি প্রতীকের উপর কেবল একটি উপসর্গটি টেক করুন । এই উত্স ফোলাটির প্রাথমিক কারণ যা আমি আগে বলেছিলাম (যেহেতু ক্লাসগুলি অন্তর্নিহিত নামের স্থান)। সি লোকেরা এটি ভালভাবে চিরকাল ধরে বেঁচে আছে এবং সম্ভবত বড় চুক্তি কী তা তা দেখতে পাবে না।
ওয়াইএমএমভি