সিতে কনস্ট কোয়ালিফায়ার এবং সি ++ এ কনস্ট কোয়ালিফায়ারের মধ্যে পার্থক্য কী?


9

আমি খুঁজে পেয়েছি একটি ব্যবহারকারী আর এর মন্তব্য :

সি এবং সি ++ একই ভাষা নয়। বিশেষত, সিconst সি ++ এর সাথে সি এর কোনও সম্পর্ক নেই const

আমি জানি, যে মধ্যবর্তী এক পার্থক্য constসি কোয়ালিফায়ার এবং constসি ++ এ কোয়ালিফায়ার তার ডিফল্ট দুটো ঘটনার নেই।

constসি ++ তে কোয়ালিফায়ার সহ নেমস্পেস স্কোপে ঘোষিত কোনও অবজেক্টের অভ্যন্তরীণ লিঙ্কেজ রয়েছে, যখন সিতে একটি অবজেক্টের সাথেconst কোয়ালিফায়ারযুক্ত বৈশ্বিক স্কোপে ঘোষিত হয়েছে ( staticআগে কোনও বাছাইকারী ছাড়াই const) বহিরাগত সংযোগ রয়েছে।

তবে কীভাবে তারা উভয় সি এবং সি ++ এর ভাষার মধ্যে পার্থক্য করে? আমি ভেবেছিলাম উভয় ভাষায় উভয়েরই একই ধরণের ধারণা এবং উদ্দেশ্য রয়েছে।

আমার প্রশ্ন:

  • সিতে কনস্ট কোয়ালিফায়ার এবং সি ++ এ কনস্ট কোয়ালিফায়ারের মধ্যে পার্থক্য কী?

"কনস্ট" এর উত্তরগুলি কীভাবে সি এবং সি ++ এর মধ্যে পৃথক হয়? কোয়ালিফায়ারের প্রসঙ্গে সি এবং সি ++ এর ভাষার মধ্যে একটি ঠিক পার্থক্য নির্দেশ করবেন না const। একটি নির্দিষ্ট ভাষায় আপনি এটি করতে বা করতে পারবেন না কেবল তা Only


এতগুলি উত্তর কেবল একটি গুগল অনুসন্ধান দূরে। তাদের মধ্যে একজন: stackoverflow.com/questions/4486442/...
schaiba

1
সি তে, constলিঙ্কেজের সাথে কিছু করার নেই। আপনার static constফাইল স্কোপ থাকতে পারে এবং এর অভ্যন্তরীণ যোগসূত্র থাকতে পারে
লন্ডিন

3
আপনি যদি সেই প্রশ্নের বর্তমান উত্তরগুলি থেকে অসন্তুষ্ট হন - যা আপনার মত একই - তবে এটিতে একটি অনুগ্রহ পোস্ট করার বিষয়টি বিবেচনা করুন।
স্নেফটেল

3
আমি সম্মত হই যে লিঙ্কযুক্ত সদৃশটি খারাপ। একটি ভাল উত্তর সমস্ত পার্থক্য তালিকাভুক্ত constএবং উভয় ভাষায় কি একই কাজ তা এতটা ব্যাখ্যা করে না।
লন্ডিন

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

উত্তর:


11
  • সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি হ'ল সি ++ এ একটি constভেরিয়েবল একটি ধ্রুবক প্রকাশ (এমনকি সি ++ 11-এর প্রবর্তনের পূর্বেও constexpr) তবে একটিconst সি তে পরিবর্তনশীল হয় না।

    এর অর্থ হ'ল সি ++ আপনাকে এই জাতীয় কিছু const size_t n = 1; static int array[n];করতে দেয় তবে historicalতিহাসিক কারণে সি তা অনুমতি দেয় না।

  • সি ++ এ, constলিঙ্কেজ নির্ধারণে অংশ নেয়। এটি সি ++ সংস্করণের মধ্যে পৃথক। সিপ্রেফারেন্স ডটকম (জোর খনি) এর মতে :

    নেমস্পেস স্কোপে ঘোষিত নীচের যে কোনও নামের অভ্যন্তরীণ লিঙ্কেজ রয়েছে:


    • অ-উদ্বায়ী নন-টেম্পলেট (সি ++ ১৪ সাল থেকে) নন-ইনলাইন (সি ++ 17 সাল থেকে) অ-রফতানি (যেহেতু সি ++ 20) কনস্টিফাইড ভেরিয়েবলগুলি (কনস্টেক্সপ্রপ সহ) বহিরাগত এবং আখেরাত ঘোষণা করা হয় না এর আগে বাহ্যিক সংযোগ থাকার ঘোষণা দেওয়া হয়েছিল;

    যদিও সি constতে লিঙ্কেজ নির্ধারণে মোটেই অংশ নেয় না - কেবলমাত্র ঘোষণার সুযোগ এবং স্টোরেজ শ্রেণীর নির্দিষ্টকরণের বিষয়টি।

  • সি ++ এ, আপনি constসদস্যের কার্যগুলি যোগ্যতা অর্জন করতে পারেন । সিতে এটি সম্ভব নয় কারণ এতে সদস্য ফাংশনগুলির জন্য সিনট্যাক্স সমর্থন নেই।

  • সি constএকটি প্রাথমিককরণ ছাড়াই যোগ্যতাযুক্ত ভেরিয়েবলগুলি ঘোষিত করার অনুমতি দেয় । সি তে, আমরা const int x;আরম্ভকারী ছাড়া লিখতে পারি , তবে সি ++ এটি অনুমতি দেয় না। এক নজরে, এটি সি-তে একটি জ্ঞানহীন ভাষার বাগের মতো মনে হতে পারে তবে যুক্তিটি হ'ল কম্পিউটারগুলি কেবল পঠনযোগ্য হার্ডওয়্যার দ্বারা হার্ডওয়্যার দ্বারা নির্ধারিত মানগুলির সাথে নিবন্ধভুক্ত হয়, সফ্টওয়্যার নয়। মানে সি হার্ডওয়্যার সম্পর্কিত প্রোগ্রামিংয়ের জন্য উপযুক্ত থাকে।


আপনি কি সি এর সদস্য ফাংশন থাকতে পারে?
ম্যাক্সিম এগারুশকিন

1
মনে রাখবেন যে const size_t n = 1; static int array[n];কেবলমাত্র সংকলকটি nধ্রুবক প্রচারের সংজ্ঞা দেখতে এবং করতে পারলে কাজ করে। extern const size_t n; static int array[n];কাজ করে না
ম্যাক্সিম এগারুশকিন

এইচএম, আমি বরং দেখি যে এই জাতীয় হার্ড রেজিস্টারগুলিকে পয়েন্টারগুলির মাধ্যমে সম্বোধন করা হচ্ছে, যেমন uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
একনকাগুয়া

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

@ লন্ডিন ভর্তি, volatile... মনোযোগ দেয় নি ... বিশ্রাম নির্ভর করে এই কেসগুলিতে আমার হাতে থাকা ডিবাগারগুলি সহজেই সমাধান করতে পারে *x। অন্যদিকে, যদি রেজিস্টারগুলিকে কিছু মেমরি অঞ্চলে ম্যাপ করা হয় এবং সংকলক নির্দিষ্ট মেমরির স্থানে সরাসরি ভেরিয়েবল স্থাপন করতে সমর্থন না করে (আমি উভয়ই দেখেছি), নির্দিষ্ট মেমরির স্থানে ভেরিয়েবলটি কিছুটা অগোছালো হয়ে যেতে পারে (মানচিত্রের ফাইলটিতে এটি আবরণ করা ...)। শেষ পর্যন্ত আমি সঠিক জায়গায় বা পয়েন্টারটিতে ভেরিয়েবল রাখার বিষয়ে খুব বেশি চিন্তা করি না, যতক্ষণ না আমি যে কাজটি আমাকে অর্পণ করা হয়েছে তা পেতে পারি;)
অ্যাকনকাগুয়া

0

সিপ্রেফারেন্স.কম থেকে :

constএকটি অ-স্থানীয় অনুদ্বায়ী অ টেম্পলেটের একটি ঘোষণা ব্যবহৃত কোয়ালিফায়ার অ ইনলাইন (যেহেতু সি ++ 17) পরিবর্তনশীল যে ঘোষণা করা হয় (সি ++ 14 থেকে) externএটা দেয় অভ্যন্তরীণ দুটো ঘটনার। এটি সি থেকে আলাদা যেখানে constফাইল স্কোপ ভেরিয়েবলের বাহ্যিক সংযোগ রয়েছে।

এর বাইরে constসি এবং সি ++ এবং সি শিরোনামে একই শব্দার্থক রয়েছে এবং constপ্রায়শই শর্তসাপেক্ষে সি ++ শিরোনাম হিসাবে সংকলিত হয় "extern C"


1
এটি একটি খারাপ উক্তি, ওভারসিম্প্লিফিকেশন। static const x;সি তে ফাইল স্কোপের অভ্যন্তরীণ সংযোগ রয়েছে। সি ভেরিয়েবলের লিংকেজটি কোন স্কোপ দ্বারা এটি ঘোষণা করা হয় তা নির্ধারণ করা হয়, পাশাপাশি স্টোরেজ শ্রেণীর নির্দিষ্টকরণকারীর উপস্থিতি / অনুপস্থিতিও নির্ধারণ করা হয়। constএবং অন্যান্য ধরণের কোয়ালিফায়াররা এর অংশ খেলে না।
লন্ডিন

@ লন্ডিন কীভাবে এই উক্তিটি থেকে আলাদা?
ম্যাক্সিম এগারুশকিন

1
আমি যে উদাহরণটি দিয়েছি তা উদ্ধৃতটিকে ভুল প্রমাণ করে। উক্তি অনুসারে, static const x;সি-তে ফাইল স্কোপের বাহ্যিক সংযোগ রয়েছে।
লুন্ডিন

@ লন্ডিন উক্তিটি বলে যে int const x = 1সিতে বাহ্যিক সংযোগ রয়েছে । সুতরাং, আপনার staticলিঙ্কটি অভ্যন্তরীণে পরিবর্তন করতে হবে। আপনার মন্তব্যের বিপরীতে উক্তিটি আমার কাছে বেশ স্পষ্ট।
ম্যাক্সিম এগারুশকিন

1
এটি সত্যিই মোটেই বলে না। উদ্ধৃতি পড়ুন। "... সি যেখানে কনস্ট ফাইল স্কোপ ভেরিয়েবলের বাহ্যিক সংযোগ রয়েছে"।
লন্ডিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.