সি ++ 11 এ অটো কীওয়ার্ডের অনুপ্রেরণা এবং সমস্যাগুলি (?)


20

আমি সম্প্রতি ভাবছিলাম যে কেন এমন autoভেরিয়েবল চিহ্নিত করার জন্য সি ++ 11 এ কীওয়ার্ডটি বেছে নেওয়া হয়েছে যার প্রকারের মতো সংকলক দ্বারা অনুমান করা উচিত

auto x = 1;

থেকে

  1. var অন্যান্য প্রোগ্রামিং ভাষায় (যেমন সি #, স্কালা, জাভাস্ক্রিপ্ট) এবং আরও সাধারণ বলে মনে হচ্ছে
  2. যতদূর আমি autoব্রেকস ব্যাকগ্রাউন্ড সামঞ্জস্যের নতুন শব্দার্থবিজ্ঞান বুঝতে পেরেছি (এটি খুব কম ব্যবহৃত হয়েছিল তবে সি ++ এর পূর্ববর্তী সংশোধনগুলির আলাদা অর্থ ছিল, উদাহরণস্বরূপ এখানে দেখুন )

আমি জিজ্ঞাসা করতে চেয়েছিলাম যে নির্বাচনের auto( বিশেষ varবা অন্য কোনও কীওয়ার্ডের পক্ষে ) কোনও বিশেষ কারণ আছে কিনা ? সি ++ 11 স্ট্যান্ডার্ড প্রকাশের আগে এই সমস্যা সম্পর্কে কোনও নির্দিষ্ট আলোচনা ছিল?

এছাড়াও, সি ++ 11 সংকলক সহ উত্তরাধিকারী সি ++ কোডটি পুনরায় সংকলনের সময় আমাদের কী কী অসঙ্গতিগুলি লক্ষ্য করা উচিত?


9
নতুন শব্দার্থবিজ্ঞানের autoপিছনে সামঞ্জস্যতা ভেঙে যেতে পারে, তবে প্রাক -11 কোডে কীওয়ার্ডটি varপ্রায়শই autoব্যবহৃত হয় তার তুলনায় ভেরিয়েবলের নাম হিসাবে কতবার ব্যবহৃত হয় তার উপর নির্ভর করে কমিটি ধারণা করেছিল যে এটি কোনও নতুন প্রবর্তনের চেয়ে সামঞ্জস্যতা কম নাটকীয়ভাবে ভেঙে ফেলেছে কীওয়ার্ড হবে।
sepp2k

2
"বর্তমানে এটি যেমন দাঁড়িয়েছে, এই প্রশ্নটি আমাদের প্রশ্নোত্তর ফর্ম্যাটের জন্য উপযুক্ত নয় We আমরা প্রত্যাশা, তথ্যসূত্র বা নির্দিষ্ট দক্ষতার দ্বারা উত্তরগুলি সমর্থন করা আশা করি, তবে এই প্রশ্নটি সম্ভবত বিতর্ক, যুক্তি, পোলিং বা বর্ধিত আলোচনার জন্য অনুরোধ করবে If আপনি মনে করেন যে এই প্রশ্নটি উন্নত হতে পারে এবং সম্ভবত পুনরায় খোলা যেতে পারে, গাইডেন্সের জন্য এফএকিউ দেখুন "": এই প্রশ্নটি একটি বাস্তবতা সম্পর্কে জিজ্ঞাসা করছে: এই বিষয়টি নিয়ে কোনও আলোচনা হয়েছিল। দুটি সম্ভাব্য উত্তর রয়েছে: হ্যাঁ এবং না।
জর্জিও

2
অবশ্যই সেখানে একটি আলোচনা হয়েছিল, যা প্রশ্নটিকে সেই ক্ষেত্রে অর্থহীন করে তোলে। autoবনাম varপ্রশ্ন কি আপনার লেখা 90% বোঝায়, এবং যে প্রশ্ন কোন নির্ধারক ফলাফলের হয়েছে। (যদিও আমি সেই ব্যক্তিই নয় যিনি বন্ধ করার পক্ষে ভোট দিয়েছেন)
টেলাস্টিন

1
@ টেলাস্টিন: আমি যদি জানতাম যে এই বিষয়ে আলোচনা হয়েছে তবে আমি জিজ্ঞাসা করতাম না। "অটো বনাম ভার সি ++" বা "অটো সি ++" এর জন্য গুগলিং এই বিষয়টিতে কিছুই ফেরেনি।
জর্জিও

1
autovarসি # তে চালু হওয়ার আগে সি ++ এর জন্য প্রস্তাব করা হয়েছিল তাই সি # কেন অটো ব্যবহার করে না তা প্রশ্ন হওয়া উচিত। জাভা
স্ক্রিপ্ট

উত্তর:


37

আপনি কোনও ভাষার কীওয়ার্ড হিসাবে যুক্ত হওয়ার কথা ভাবতে পারেন এমন প্রায় প্রতিটি শব্দই অবশ্যই অবশ্যই ভেরিয়েবলের নাম বা ওয়ার্কিং কোডের অন্য কোনও অংশ হিসাবে ব্যবহৃত হয়েছে। আপনি যদি এই শব্দটিকে কীওয়ার্ড বানান তবে এই কোডটি নষ্ট হয়ে যাবে।

অবিশ্বাস্যভাবে ভাগ্যবান বিষয়টি autoহ'ল এটি ইতিমধ্যে একটি কীওয়ার্ড ছিল, সুতরাং সেই নামের সাথে লোকের ভেরিয়েবল ছিল না, তবে কেউ এটি ব্যবহার করেনি, কারণ এটি ডিফল্ট ছিল। কেন টাইপ করুন:

auto int i=0;

কখন

int i=0;

ঠিক একই জিনিস বোঝানো?

আমি গ্রহটির কোথাও কোথাও কোথাও কিছু অল্প পরিমাণে কোড পেয়েছি যা 'অটো' পুরানো উপায়ে ব্যবহার করেছিল। তবে এটি 'অটো' অপসারণের মাধ্যমে ঠিক করা যেতে পারে এবং এটি আবার কাজ করবে। সুতরাং কীওয়ার্ডটি পুনরায় প্রকাশ করা এটি বেশ সুস্পষ্ট পছন্দ ছিল।

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

(ছোট) ব্রেকিং স্পষ্ট করতে:

তোমার যদি থাকত

auto int i=0;

এবং একটি সি ++ 11 সংকলক দিয়ে সংকলনের চেষ্টা করেছিলেন, আপনি এখন যেমন একটি ত্রুটি পাবেন

ত্রুটি C3530: 'অটো' অন্য কোনও টাইপ-স্পেসিফায়ারের সাথে একত্রিত করা যায় না

এটি তুচ্ছ, আপনি কেবল অটো বা ইনটটি সরিয়ে পুনরায় সংযোগ করুন।

যদিও আরও বড় সমস্যা আছে। তোমার যদি থাকত

auto i = 4.3;

সি এবং সত্যই পুরানো সি ++ iএকটি তৈরি করবে int(এটি যদি আপনি ছেড়ে চলে যান auto- ডিফল্ট ঘোষণা ছিল int) ration আপনি যদি এই কোডটি সংকলন না করে সত্যিই দীর্ঘ সময় চলে গেছেন বা পুরানো সংকলক ব্যবহার করছেন তবে কমপক্ষে তাত্ত্বিকভাবে আপনার এই কোডটির কিছু থাকতে পারে। সি ++ 11 এটিকে double4.3 এর থেকে তৈরি করবে 4. (বা হতে পারে একটি float, আমি এখনও বক্সিং ডে মোডে আছি, তবে বিষয়টি হ'ল একটি নয় int) এটি আপনার অ্যাপ্লিকেশন জুড়ে সূক্ষ্ম বাগগুলি প্রবর্তন করতে পারে। এবং সংকলক থেকে কোনও সতর্কতা বা ত্রুটি ছাড়াই। এই বোটের লোকেরা autoসি ++ 11 সংকলক যাওয়ার আগে তারা এটি পুরানো উপায়ে ব্যবহার করছে না তা নিশ্চিত করার জন্য বিশ্বব্যাপী অনুসন্ধান করা উচিত । ভাগ্যক্রমে, এই জাতীয় কোড অত্যন্ত বিরল।


খুব পরিষ্কার উত্তরের জন্য ধন্যবাদ। +1 আমি বেশিরভাগ ক্ষতিকারক উপায়ে পশ্চাদপদ সামঞ্জস্যতা বাদ দেওয়ার এবং পুরানো কোডটি নতুন কীওয়ার্ড দ্বারা ভেঙে না ফেলার বড় সম্ভাবনা থাকার মধ্যে বাণিজ্য বন্ধ বুঝতে পারি।
জর্জিও

আসলেই কি কোনও অসম্পূর্ণতা আছে? কোনও সি ++ 11 সংকলক autoযদি কোনও টাইপ নাম অনুসারে অনুসরণ করা হয় তবে তা উপেক্ষা করবেন না ?
আআআআআআআআআআআআআআআআআ

1
ভিজ্যুয়াল সি ++ 2012 error C3530: 'auto' cannot be combined with any other type-specifierসেই লাইনে বলেছেন
কেট গ্রেগরি

3
@ কেটগ্রিগরি: আসলে, এতে কোনও সমস্যা নেই auto i = 4.3;, কারণ এটি সি ++ ০৩ / সি ++ ৯৮-তে খারাপ ছিল। সি ++ হয়নি না 'অন্তর্নিহিত int- এ' নিয়ম উপর বহন করে C89 ছিল (এবং C99 সংস্করণ বাদ)।
বার্ট ভ্যান ইনজেন শেহেনো

1
@ কেট গ্রেগরি: আপনি যদি বার্টের পর্যবেক্ষণগুলিকে বিবেচনায় নিয়ে নিতে পারেন এবং সেই অনুসারে আপনার উত্তর পরিবর্তন করতে পারেন তবে আমি এটিকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করব।
জর্জিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.