সি ++ থেকে সি তে সরানো হচ্ছে


83

কয়েক বছর সি ++ এ কোডিং করার পরে, আমাকে এমবেডড ফিল্ডে সম্প্রতি সি তে একটি কোডিং কোড দেওয়ার প্রস্তাব দেওয়া হয়েছিল।

এম্বেড থাকা ক্ষেত্রে সি ++ খারিজ করা সঠিক বা ভুল কিনা এই প্রশ্নটি বাদ দিয়ে, সি ++ তে কিছু বৈশিষ্ট্য / মূর্তি রয়েছে যা আমি খুব মিস করব। মাত্র কয়েক নাম:

  • জেনেরিক, টাইপ-সেফ ডেটা স্ট্রাকচার (টেমপ্লেট ব্যবহার করে)।
  • আরআইআইআই বিশেষত একাধিক রিটার্ন পয়েন্ট সহ ফাংশনগুলিতে, উদাহরণস্বরূপ প্রতিটি রিটার্ন পয়েন্টে মিটেক্সটি প্রকাশের কথা মনে রাখবেন না।
  • সাধারণভাবে ধ্বংসকারী অর্থাৎ আপনি মাই ক্লাসের জন্য একবার ডিটার লিখেন, তারপরে যদি মাই ক্লাস উদাহরণটি মাইথার ক্লাসের সদস্য হয় তবে মাইওথার ক্লাসটি মাইক্লাস উদাহরণটি স্পষ্টভাবে ডিনিটাইয়ালাইজ করতে হবে না - এর ডিটারটি স্বয়ংক্রিয়ভাবে ডাকা হয়।
  • নেমস্পেসেস

আপনার অভিজ্ঞতাগুলি কি সি ++ থেকে সি তে চলেছে?
আপনার পছন্দের সি ++ বৈশিষ্ট্য / আইডিয়ামগুলির জন্য আপনি কোন সি বিকল্পটি খুঁজে পেয়েছেন? আপনি চান সি ++ এর কোন সি বৈশিষ্ট্য আবিষ্কার করেছেন?


12
আপনি যদি কেবল অভিজ্ঞতার কথা জিজ্ঞাসা করেন এবং পরামর্শ না দিয়ে থাকেন তবে সম্ভবত সম্প্রদায়ের উইকি হওয়া উচিত।
পিটার আলেকজান্ডার

6
আপনি প্রাগ.এসইতে আগ্রহী হতে পারেন ।

11
@ পিটার: প্রশ্নগুলি আর ওপি দ্বারা সিডব্লিউ তৈরি করা যায় না, এবং এখনও যখন সম্ভব ছিল তখন তার চেয়ে বেশি প্রতিনিধি প্রয়োজন। আপনি যদি মনে করেন যে আরও বেশি ব্যবহারকারীদের "সম্প্রদায়ের মালিকানাধীন" পোস্টগুলি সম্পাদনা করার অনুমতি দেওয়া ছাড়া অন্য কোনও কারণে একটি প্রশ্নকে সম্প্রদায় উইকি করা উচিত, তবে আপনি যা চান তা প্রশ্নটি বন্ধ করে দেওয়া উচিত।

4
এই প্রশ্নটি কি প্রোগ্রামার্স.এসে বেশি উপযুক্ত হবে না? যেহেতু এটি অবশ্যই "আসল" প্রশ্ন, তাই আমি বলি আমরা এটি আবার খুলি এবং পরিবর্তে এটি স্থানান্তরিত করার জন্য ভোট দিয়ে থাকি। এবং এটি সম্ভব নয়। ঠিক আছে.
লাসে ভি কার্লসেন

21
প্রগ এসই বিটা ছাড়ার আগ পর্যন্ত চলমান ঘটবে না, এবং আমি মনে করি যে কোনও ক্ষেত্রে QA- এ এই পদ্ধতির ব্রেনডিয়াড তৈরি হচ্ছে। এটি সম্প্রদায়কে টুকরো টুকরো করছে, ব্যবহারকারীদের বিরক্ত করছে, প্রশ্ন এবং উত্তরগুলি সদৃশ করছে। এটি অসংগঠিত তথ্যের একটি মায়াম তৈরি করছে যা পূর্বে অ্যাক্সেসযোগ্য এবং একক "প্রোগ্রামার" সাইটে নেভিগেশ্য ছিল। তদ্ব্যতীত, এটি এই জাতীয় মত প্রশ্ন, বিশাল দৃষ্টিভঙ্গি এবং অবিশ্বাস্য upvoting, যা আমাকে 5 তিরস্কার-ঘনিষ্ঠ এবং পুরো সম্প্রদায়ের মধ্যে ক্রুদ্ধ করে তোলে।
স্টেফানো বোরিনি

উত্তর:


68

এম্বেড থাকা প্রকল্পে কাজ করে, আমি একবারে সমস্ত সিতে কাজ করার চেষ্টা করেছি, এবং কেবল এটি দাঁড়াতে পারিনি। এটি ঠিক এতটা ভার্বোজ ছিল যে কোনও কিছু পড়তে অসুবিধা করেছিল। এছাড়াও, আমি লিখেছিলাম এমন অনুকূলিত-এমবেডেড পাত্রে পছন্দ করেছি, যা #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

/* Non-inlines, "static members", global definitions, etc. go here. */

#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:;
    }

    /* Figure out `result` for real, then fall through to... */

Queue_##TYPE##_Top_exit:
    Mutex_Lock(this->lock);
    return result;
}

সাধারণভাবে ধ্বংসকারী

অর্থাৎ আপনি মাই ক্লাসের জন্য একবার ডিটার লিখেন, তারপরে যদি মাইক্লাস উদাহরণটি মাইথার ক্লাসের সদস্য হয় তবে মাইওথার ক্লাসটি মাইক্লাস উদাহরণটি স্পষ্টভাবে ডিনিটাইয়ালাইজ করতে হবে না - এর ডিটারটি স্বয়ংক্রিয়ভাবে ডাকা হয়।

অবজেক্ট কনস্ট্রাকশনটি স্পষ্টভাবে একইভাবে পরিচালনা করতে হবে।

নেমস্পেসেস

এটি ঠিক করার জন্য একটি সহজ একটি: প্রতিটি প্রতীকের উপর কেবল একটি উপসর্গটি টেক করুন । এই উত্স ফোলাটির প্রাথমিক কারণ যা আমি আগে বলেছিলাম (যেহেতু ক্লাসগুলি অন্তর্নিহিত নামের স্থান)। সি লোকেরা এটি ভালভাবে চিরকাল ধরে বেঁচে আছে এবং সম্ভবত বড় চুক্তি কী তা তা দেখতে পাবে না।

ওয়াইএমএমভি


60
অবশ্যই আপনি সিটিকে ঘৃণা করেন যদি আপনি এটি জোর করে সি ++ করার চেষ্টা করেন। আমি সন্দেহ করি আপনি যদি এটির মধ্যে আরও ex more_expression_language এর বৈশিষ্ট্য আরোপ করার চেষ্টা করেন তবে সি ++ দেখতে দুর্দান্ত লাগবে। আপনার পোস্টের সমালোচনা নয়, কেবল একটি পর্যবেক্ষণ :-)

RAII-এর পরিবর্তে- রআইআই কৌশলটি সম্পর্কে: এটি কি রক্ষণাবেক্ষণের দুঃস্বপ্ন নয়? অর্থাত্ যখনই আপনি কোনও কোড পাথ যুক্ত করেন যা ক্লিনআপের প্রয়োজন হয়, বা এমনকি ফাংশনের অভ্যন্তরে জিনিসগুলির ক্রম পরিবর্তন করে, আপনাকে শেষের দিকে গোটো লেবেলে যেতে হবে এবং সেগুলিও পরিবর্তন করতে হবে। আমি এমন একটি কৌশল দেখতে চাই যা কোনওভাবে পরিষ্কার করতে হবে তার ঠিক পাশেই ক্লিনআপ কোডটি নিবন্ধভুক্ত করে।
জর্জে

4
@ জর্জ: এটি বলতে আমি ঘৃণা করি, তবে বেশিরভাগ এমবেডেড সি কোড আমি দেখেছি সি মানদণ্ডের দ্বারা খুব খারাপ। উদাহরণস্বরূপ, আমি এখনই এটিমেলের at91lib এর সাথে কাজ করছি এবং এটির জন্য আপনাকে একটি "বোর্ড.h" ফাইল লিখতে হবে যা তাদের কোডের বেশিরভাগ অংশ নির্ভরতা হিসাবে টানতে পারে। , (তাদের ডেমো বোর্ড জন্য, এই হেডার 792 লাইন দীর্ঘ।) এ ছাড়া একটি "LowLevelInit ()" ফাংশন আপনি আপনার বোর্ড প্রায় পুরোটাই ব্যবহারের রেজিস্টার হয় কাস্টমাইজ করতে, মত লাইনের আছেAT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN | AT91C_CKGR_MOSCSEL;
মাইক DeSimone

4
ওহ, এবং সেখানে কিছুই আপনাকে জানায় না যে BOARD_OSCOUNT(কোনও ঘড়িটি স্যুইচ করার জন্য অপেক্ষা করার জন্য সময়সীমার মান; স্পষ্ট, হু?) আসলে একটি #defineইন board.h। এছাড়াও একই ফাংশনে, অনেকগুলি অনুলিপি-আটকানো স্পিন লুপ কোড, যা একটি দুটি-লাইনে পরিণত করা উচিত ছিল #define(এবং আমি যখন এটি করেছি তখন এটি কোডের কয়েকটি বাইট সংরক্ষণ করে এবং নিবন্ধকার সেট এবং স্পিন লুপগুলি আরও স্বতন্ত্র করে আরও পাঠযোগ্য ফাংশন) function সি ব্যবহারের বড় কারণগুলির মধ্যে একটি হ'ল এটি আপনাকে মাইক্রো ম্যানেজ করতে এবং সবকিছুকে অনুকূলিত করতে দেয় তবে আমি দেখেছি বেশিরভাগ কোড বিরক্ত করে না।
মাইক ডিসিমোন

4
@ ম্যাডসের সাথে সম্মত হন আপনার সত্যিকারের প্রয়োজন নেই এমন বৈশিষ্ট্যগুলির জন্য সেগুলির মধ্যে দিয়ে যাওয়ার কোনও কারণ নেই। আমি জিটিকে লাইব্রেরির মতো শৈলী উপভোগ করেছি। আপনার "শ্রেণি" স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করুন এবং তারপরে my_class_new () এর মতো ধারাবাহিক পদ্ধতি তৈরি করুন এবং তারপরে "পদ্ধতিগুলিতে" পাস করুন: my_class_do_this (my_class_instance)
সর্বোচ্চ

17

আমি ভিন্ন কারণে (একরকম অ্যালার্জির প্রতিক্রিয়া;) জন্য সি ++ থেকে সিতে চলে এসেছি এবং আমি মিস করেছি কেবলমাত্র কয়েকটি জিনিস এবং আমি অর্জন করেছি এমন কিছু জিনিস। আপনি যদি C99 এ লেগে থাকেন, যদি আপনি পারেন তবে এমন কিছু নির্মাণ রয়েছে যা আপনাকে বিশেষ করে বেশ সুন্দর এবং নিরাপদে প্রোগ্রাম করতে দেয়

  • মনোনীত ইনিশিয়ালাইজার (শেষ পর্যন্ত ম্যাক্রোগুলির সাথে মিলিত) সাধারণ ক্লাসগুলির আরম্ভিককরণ যেমন নির্মাতাদের মতো বেদনাদায়ক করে তোলে
  • অস্থায়ী ভেরিয়েবলের জন্য যৌগিক আক্ষরিক
  • for-স্কোপ ভেরিয়েবল আপনাকে প্রাথমিক স্তরের রিটার্নের অধীনে এমনকি মূটেক্সগুলি বা অ্যারেগুলি নিশ্চিত করতে স্কোপ বাউন্ড রিসোর্স ম্যানেজমেন্ট করতে সহায়তা করতে পারেunlockfree
  • __VA_ARGS__ ম্যাক্রোগুলিকে ফাংশনে ডিফল্ট আর্গুমেন্ট ব্যবহার করতে এবং কোড আনরোলিং করতে ব্যবহার করা যেতে পারে
  • inline ফাংশন এবং ম্যাক্রোগুলি যা ওভারলোডেড ফাংশনগুলি (সাজানোর) প্রতিস্থাপনের জন্য ভালভাবে একত্রিত হয়

4
@ মাইক: বিশেষ করে কোন অংশের জন্য? আপনি forস্কোপগুলির জন্য আমি যে লিঙ্কটি দিয়েছি তা যদি আপনি অনুসরণ করেন তবে আপনি P99 এ অবতরণ করবেন যেখানে আপনি অন্যান্য অংশের উদাহরণ এবং বিবরণও পেতে পারেন।
জেনস গুডস্ট


@ জর্জ: ধন্যবাদ! @ জেনস: অন্য চারটির উদাহরণ। আমি আমার সি এর পিছনে পড়েছি; সর্বশেষে আমি শুনেছি তারা রানটাইম-আকারের স্বয়ংক্রিয়-বরাদ্দকৃত (যেমন স্ট্যাক) অ্যারে (উদাঃ void DoSomething(unsigned char* buf, size_t bufSize) { unsigned char temp[bufSize]; ... }) এবং কাঠামোর সূচনা ক্ষেত্রের নামগুলি (উদাহরণস্বরূপ struct Foo bar = { .field1 = 5, .field2 = 10 };) দ্বারা যুক্ত করেছে, পরে আমি সি ++ এ দেখতে পছন্দ করব, বিশেষত নন-পড অবজেক্টের সাথে (যেমন UART uart[2] = { UART(0x378), UART(0x278) };) ।
মাইক ডিসিমোন

@ মাইক: হ্যাঁ চলক দৈর্ঘ্যের অ্যারে (ভিএলএ) রয়েছে তবে সম্ভাব্য স্ট্যাকওভারফ্লোয়ের কারণে সেগুলি ব্যবহার করা কিছুটা বিপজ্জনক হতে পারে। দ্বিতীয়টি যেটি আপনি বর্ণনা করেছেন তা হ'ল "মনোনীত আরম্ভকারী", সুতরাং সেখানে আপনি নিজের উদাহরণ দিয়ে যান ;-) অন্যদের জন্য আপনি উপরের পি 99 লিঙ্কটিতে তথ্য খুঁজে পান যদি আপনি "সম্পর্কিত পৃষ্ঠাগুলি" ক্লিক করেন।
জেনস গুষ্ট্ড্ট

8

সিটির জন্য এসটিএলের মতো কিছুই বিদ্যমান
নেই এমন লিব রয়েছে যা অনুরূপ কার্যকারিতা সরবরাহ করে তবে এটি আর অন্তর্নির্মিত নয়।

ভাবুন এটি আমার সবচেয়ে বড় সমস্যা হয়ে উঠবে ... আমি কোন সরঞ্জামটি দিয়ে সমস্যাটি সমাধান করতে পারি তা জেনেও আমার কাছে যে ভাষাটি ব্যবহার করতে হবে সেগুলিতে সরঞ্জামগুলি উপলব্ধ নেই।


এটি সত্য। কেউ কি কনটেইনার-ক্লাসের লাইব্রেরিগুলিকে সি এর জন্য ব্যবহার করা উচিত? নাকি উত্তরটি "নিজেরাই একটি লিখুন"?
সন্দীপ

@ সন্দীপ: প্রারম্ভিকদের জন্য, এই উত্তরটি কেবল ধারকীয় স্ট্যান্ডার্ড লিবে না থাকা সম্পর্কে সঠিক। একটি এসটিএল সমতুল্য (সি ++ এর সর্বোত্তম অংশ) অভাব বাদে সি স্ট্যান্ডার্ড লাইব্রেরিটি অনেক উন্নত। পসিক্সে কিউসোর্ট ছাড়াও টিশার্ক, লেসার্ক, hsearch এবং বিসার্ক রয়েছে যা libc এ রয়েছে। গ্লিব হ'ল সি'র "বুস্ট", এটি একবারে দেখুন এটিতে গুডিজ রয়েছে (পাত্রে অন্তর্ভুক্ত) with গ্রন্থাগার .gnome.org/devel/glib/stable । গ্লিব Gtk + এর সাথে একীভূত হয়, এমন একটি সংমিশ্রণ যা বুস্ট এবং Qt ছাড়িয়ে যায়। সাববাশন এবং অ্যাপাচি এর মতো এক্সপ্ল্যাটফর্ম স্টাফের জন্য জনপ্রিয় লিবাপ্পারও রয়েছে।
ম্যাট যোগদানকারী

আমি স্টলের সাথে প্রতিযোগিতা করতে পারে এমন সি এর কোনও লিবস খুঁজে পাচ্ছি না, তারা ব্যবহার করা শক্ত, বজায় রাখা আরও কঠিন, যখন তারা সি লিবকে সাধারণের মতো জেনেরিক রাখতে চায় তখন পারফরম্যান্স স্টিলের প্রতিদ্বন্দ্বী হয় না his গ এর সীমাবদ্ধতা, এবং সি লাইব্রেরিতে stl এর মতো কিছু আমাদের কেন না থাকতে পারে তার কারণগুলি, কারণ সি কেবল stl এর মতো কিছু বিকাশের ক্ষমতা রাখে না।
স্টিরিওম্যাচিং

8

সি এবং সি ++ এর মধ্যে পার্থক্যটি কোডের আচরণের পূর্বাভাসযোগ্য।

আপনার কোডটি সি তে কী করবে তার দুর্দান্ত নির্ভুলতার সাথে ভবিষ্যদ্বাণী করা আরও সহজ, সি ++ এ একটি সঠিক ভবিষ্যদ্বাণী নিয়ে আসতে আরও কিছুটা জটিল হয়ে উঠতে পারে।

সি এর পূর্বাভাসযোগ্যতা আপনাকে আপনার কোডটি কী করছে তার আরও ভাল নিয়ন্ত্রণ দেয় তবে এর অর্থ এটি আপনাকে আরও স্টাফ করতে হবে।

সি ++ তে আপনি একই জিনিসটি পেতে কম কোড লিখতে পারেন, তবে (আমার জন্য ইঁদুর) মাঝে মাঝে মাঝে সমস্যা হয় কীভাবে অবজেক্ট কোডটি মেমরিতে আউট করা হয় এবং এটি প্রত্যাশিত আচরণ তা জানতে আমার সমস্যা হয়।


4
যখনই আমি কোডটি আসলে কী করছে তা নিয়ে আমি যখনই উদ্বেগ প্রকাশ করি তখন আমি সমাবেশটি ডাম্প পেতে, উদ্বেগের ফাংশনটি অনুসন্ধান করতে এবং পড়া শুরু করতে -sপতাকা যুক্ত করি gcc। যে কোনও সঙ্কলিত ভাষার শিখার শিখার এক দুর্দান্ত উপায়।
মাইক ডিসিমোন

4
এটিও সময় নষ্ট, সি ++ উত্পন্ন সমাবেশ হিসাবে দেখা পার্ল পড়ার মতো হবে। যাই হোক না কেন খুঁজছেন জন্য ব্রাভো।
ম্যাট যোগদানকারী

7

আমার কাজের লাইনে - যা এমবেড করা আছে, উপায় দ্বারা - আমি ক্রমাগত সি এবং সি ++ এর মধ্যে পিছনে পিছনে স্যুইচ করছি।

আমি যখন সি তে থাকি তখন আমি সি ++ থেকে মিস করি:

  • টেমপ্লেটগুলি (এসটিএল ধারকগুলি সহ কিন্তু তবে সীমাবদ্ধ নয়)। আমি এগুলিকে বিশেষ কাউন্টার, বাফার পুল ইত্যাদির জন্য ব্যবহার করি (ক্লাস টেম্পলেট এবং ফাংশন টেম্পলেটগুলির নিজস্ব লাইব্রেরি তৈরি করেছি যা আমি বিভিন্ন এম্বেডড প্রকল্পগুলিতে ব্যবহার করি)

  • খুব শক্তিশালী স্ট্যান্ডার্ড লাইব্রেরি

  • ডেস্ট্রাক্টর, যা অবশ্যই RAII কে সম্ভব করে তোলে (মুটেক্সেস, ইন্টারপ্রেট ডিজেবল, ট্রেসিং ইত্যাদি)

  • অ্যাক্সেস স্পেসিফায়ারগুলি, কে কী ব্যবহার করতে পারে তা আরও ভালভাবে প্রয়োগ করতে (দেখুন না)

আমি বৃহত্তর প্রকল্পগুলিতে উত্তরাধিকার ব্যবহার করি এবং এর জন্য সি ++ এর অন্তর্নির্মিত সমর্থনটি প্রথম সদস্য হিসাবে বেস ক্লাসটি এম্বেড করার সি "হ্যাক" এর চেয়ে অনেক ক্লিনার এবং সুন্দর ( ) তবে উপরে তালিকাবদ্ধ আইটেমগুলি আমি সবচেয়ে বেশি মিস করছি।

এছাড়াও, সম্ভবত আমি ব্যবহার ব্যাতিক্রমগুলিতে এম্বেড করা সি ++ প্রকল্পের প্রায় এক তৃতীয়াংশ কাজ করি, তাই আমি এগুলি ছাড়া বাঁচতে অভ্যস্ত হয়ে পড়েছি, সুতরাং আমি যখন সিতে ফিরে যাই তখন আমি সেগুলি খুব বেশি মিস করি না I

ফ্লিপ দিকে, যখন আমি উল্লেখযোগ্য সংখ্যক বিকাশকারীকে নিয়ে একটি সি প্রকল্পে ফিরে যাই, তখন C ++ সমস্যার পুরো ক্লাস থাকে যা আমি দূরে চলে যাওয়া লোকদের বোঝাতে ব্যবহার করি। বেশিরভাগ ক্ষেত্রে সি ++ এর জটিলতার কারণে সমস্যা হয় এবং যারা মনে করেন যে তারা কী হচ্ছে তা জানেন তবে তারা সত্যই C ++ আত্মবিশ্বাসের বক্ররেখার "ক্লাস সহ ক্লাসে" রয়েছেন ।

পছন্দটি দেওয়া হয়েছে, আমি কোনও প্রকল্পে সি ++ ব্যবহার করতে পছন্দ করব তবে কেবল যদি টিমটি ভাষাটির বিষয়ে দৃ solid় হয়। অবশ্যই ধরে নেওয়া যে এটি একটি 8 কে-সি প্রকল্প নয় যেখানে আমি কার্যকরভাবে "সি" লিখছি।


4
"সি ++ কনফিডেন্স কার্ভ" আমাকে কিছুটা বিরক্ত করে। এটি যেভাবে লেখা হয়েছে এবং মন্তব্যগুলি বোঝায় যে সি ++ হতাশ, হারিয়ে যাওয়া কারণ বা যা কিছু whatever আমি কিছু অনুপস্থিত করছি?
মাইক ডিসিমোন

নিমজ্জন নিন, আমরা আপনাকে কয়েক বছরের মধ্যে দেখতে পাব। বেশিরভাগ ভাল প্রোগ্রামাররা টক স্বাদের সাথে অন্যদিকে চলে আসে।
ম্যাট যোগদানকারী

3

কয়েক পর্যবেক্ষণ

  • আপনার সি তৈরির জন্য আপনি যদি আপনার সি ++ সংকলক ব্যবহার করার পরিকল্পনা না করেন (যদি আপনি সি ++ এর ভাল সংজ্ঞায়িত উপসেটটি আটকে থাকেন তবে) আপনি শীঘ্রই এমন জিনিস আবিষ্কার করতে পারবেন যা আপনার সংকলক সিটিতে অনুমতি দেয় যা সি ++ এর একটি সংকলন ত্রুটি হতে পারে।
  • আর কোনও ক্রিপ্টিক টেম্পলেট ত্রুটি নেই (হ্যাঁ!)
  • কোন (ভাষা সমর্থিত) অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং

সি টেমপ্লেট সমর্থন করে না এর অর্থ এই নয় যে আমাদের "জেনেরিক দৃষ্টান্তগুলি" দরকার নেই, সিতে আপনাকে "জেনেরিক প্যারাডিজম" প্রয়োজন হলে টেমপ্লেট নকল করতে মূখ্য * এবং ম্যাক্রো ব্যবহার করতে হবে vo এছাড়াও বেশ কৃপণ, টেমপ্লেটের চেয়ে ভাল নয় e
স্টিরিওম্যাচিং

2

খাঁটি সি এর চেয়ে সি ++ বা সি / সি ++ এর মিশ্রণটি ব্যবহার করার জন্য আমার কাছে একই কারণগুলি অনেক বেশি কারণ আমি নেমস্পেস ছাড়াই বেঁচে থাকতে পারি তবে কোড স্ট্যান্ডার্ড এটির অনুমতি দিলে আমি সব সময় তাদের ব্যবহার করি। কারণগুলি হ'ল আপনি সি ++ তে আরও অনেক কমপ্যাক্ট কোড লিখতে পারেন। এটি আমার পক্ষে খুব উপকারী, আমি সি ++ তে এমন সার্ভার লিখি যা এখন এবং তারপরে ক্র্যাশ হয়। আপনি যে কোডটি দেখছেন তা সংক্ষিপ্ত এবং সমন্বিত থাকলে এটি সেই ক্ষেত্রে অনেক সহায়তা করে। উদাহরণস্বরূপ নিম্নলিখিত কোড বিবেচনা করুন:

uint32_t 
ScoreList::FindHighScore(
  uint32_t p_PlayerId)
{
  MutexLock lock(m_Lock); 

  uint32_t highScore = 0; 
  for(int i = 0; i < m_Players.Size(); i++)
  {
    Player& player = m_Players[i]; 
    if(player.m_Score > highScore)
      highScore = player.m_Score; 
  }

  return highScore; 
}

সি এর মতো দেখতে:

uint32_t 
ScoreList_getHighScore(
  ScoreList* p_ScoreList)
{
  uint32_t highScore = 0; 

  Mutex_Lock(p_ScoreList->m_Lock); 

  for(int i = 0; i < Array_GetSize(p_ScoreList->m_Players); i++)
  {
    Player* player = p_ScoreList->m_Players[i]; 
    if(player->m_Score > highScore)
      highScore = player->m_Score; 
  }

  Mutex_UnLock(p_ScoreList->m_Lock);

  return highScore; 
}

পার্থক্যের পৃথিবী নয়। কোডের আরও একটি লাইন, তবে এটি যুক্ত হতে থাকে। সাধারণভাবে আপনি এটিকে পরিষ্কার এবং দুর্বল রাখার জন্য যথাসাধ্য চেষ্টা করেন তবে কখনও কখনও আপনাকে আরও জটিল কিছু করতে হয়। এবং এই পরিস্থিতিতে আপনি আপনার লাইন গণনা মূল্যবান। আপনার সম্প্রচারের নেটওয়ার্কটি হঠাৎ কেন বার্তা সরবরাহ করা বন্ধ করে দেয় তা বোঝার চেষ্টা করার সময় আরও একটি লাইন দেখার বিষয়।

যাইহোক আমি দেখতে পাচ্ছি যে সি ++ আমাকে নিরাপদ ফ্যাশনে আরও জটিল জিনিসগুলি করার অনুমতি দেয়।


সিতে আপনি এটি "int (= i = 0") করতে পারবেন না
ভিক্টর

6
ভিক্টর যদিও এটি বৈধ c99 (অথবা কিছু টাইপিংয়ের জন্য সি ++ সংকলক সহ সি সংকলন)।
রোমান এ। টেচার 20

আমি সুরক্ষা বিশ্বাস করতে পারি না। সুতরাং আপনার মিটেক্সটি স্কোপড। এখন আপনি জানেন না কেন এটি আনলক করা কেন একটি ব্যতিক্রম "ভ্রমন" হওয়া উচিত। এটি কখন আনলক হবে তা আপনি জানেন না, আপনার কোডের যে কোনও অংশের যথেষ্ট পরিমাণে সিদ্ধান্ত নিতে পারে এবং নিক্ষেপ করতে পারে। অতিরিক্ত অতিরিক্ত "নিরাপদতাগুলি" বাগগুলি মাস্কিং করতে পারে।
ম্যাট জয়েনার

ম্যাট, আমরা জানি যে এটি কেন আনলক হয়েছে normal সাধারণ ক্ষেত্রে, যখন প্রোগ্রামটি ক্ষেত্রের শেষের দিকে পৌঁছে যায় তখন মিউটেক্স আনলক হয়ে যায়, আমাদের হাতে তৈরি কোডগুলি এটি আনলক করার দরকার নেই, এটি একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন f যদি সেখানে থাকে ব্যতিক্রম ঘটে, মিটেক্স আনলক হয়ে যাবে এবং আমরা ব্যতিক্রমটি ধরতে পারি এবং এটি থেকে ত্রুটি বার্তাটি পড়তে পারি error ত্রুটি বার্তাটি যথেষ্ট ভাল বা আপনি কীভাবে ব্যতিক্রম করবেন তার উপর নির্ভর করবে না।
স্টিরিও ম্যাচিং

0

আমি মনে করি যে এম্বেড থাকা পরিবেশে সি ++ কেন গ্রহণযোগ্যতর হয় তার প্রধান সমস্যা হ'ল ইঞ্জিনিয়ারদের অভাব যারা সি ++ সঠিকভাবে কীভাবে ব্যবহার করবেন তা বোঝে।

হ্যাঁ, একই যুক্তিটিও সিটিতে প্রয়োগ করা যেতে পারে তবে ভাগ্যক্রমে সি তেমন কোনও সমস্যা নেই যা নিজেকে পায়ে গুলি করতে পারে। অন্যদিকে সি ++, সি ++ এ নির্দিষ্ট বৈশিষ্ট্য কখন ব্যবহার করবেন না তা আপনার জানতে হবে।

সব মিলিয়ে আমি সি ++ পছন্দ করি। আমি ও / এস পরিষেবাদি স্তর, ড্রাইভার, পরিচালনা কোড ইত্যাদিতে এটি ব্যবহার করি তবে আপনার টিমের যদি এটির যথেষ্ট অভিজ্ঞতা না থাকে তবে এটি একটি কঠিন চ্যালেঞ্জ হতে পারে।

দুজনের সাথেই আমার অভিজ্ঞতা ছিল। দলের বাকি সদস্যরা যখন এর জন্য প্রস্তুত ছিল না, তখন এটি ছিল মোট বিপর্যয়। অন্যদিকে, এটি ছিল ভাল অভিজ্ঞতা।


0

হ্যাঁ! আমি এই দুটি ভাষাতেই অভিজ্ঞতা অর্জন করেছি এবং যা আমি পেয়েছি তা সি ++ আরও বন্ধুত্বপূর্ণ ভাষা। এটি আরও বৈশিষ্ট্য সহ সুবিধামত করে। এটি বলা ভাল যে সি ++ সি ভাষার সুপারসেট কারণ এটি পলিমারফিজম, ইন্টারিট্যান্স, অপারেটর এবং ফাংশন ওভারলোডিং, ব্যবহারকারী সংজ্ঞায়িত ডেটা টাইপ যা সত্যিকার অর্থে সি তে সমর্থিত হয় না যেমন অতিরিক্ত বৈশিষ্ট্য সরবরাহ করে কোড সহ হাজার লাইনের সাথে কয়েকটি লাইনে হ্রাস করা হয় C থেকে C ++ এ যাওয়ার মূল কারণ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সহায়তা।


সি ++ প্রকৃতপক্ষে সি এর সুপারস্টার নয়; সি কোড লিখতে খুব সহজ যা একটি সি ++ সংকলক সংকলন করতে ব্যর্থ হবে। অন্যদিকে, অবজেক্টিভ-সি হ'ল (কি?) সি এর কঠোর সুপারস্টেট
বিজ্ঞাপন urd

@ এক্সনিহিলো কনভেনশন সুপারশেটটি এখানে সংজ্ঞায়িত করতে হবে যে সি ++ আরও বৈশিষ্ট্য নিয়ে আসে। এটি সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের উন্নতি করে এবং ত্রুটির সম্ভাবনা হ্রাস করে। কিছু কোড রয়েছে যা সি ++ তে সংকলন করেনি তবে সি তে করতে পারে যেমন কনস্ট ইন্ট এ; এটি সি ++ এ ত্রুটি দেয় কারণ ঘোষণার সময় ধ্রুবকটি শুরু করা প্রয়োজন যখন সিতে ধারণাটি সংকলন করবে। সুতরাং সুপারসেট গণিতের মতো শক্ত এবং দ্রুত নিয়ম নয় (A⊂B) বরং এটি একটি আনুমানিক যা সি ++ অবজেক্ট ওরিয়েন্টেড কনসেপ্টের মতো অতিরিক্ত বৈশিষ্ট্য সরবরাহ করে।
কায়নাট লিয়াকত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.