কেন অটো অ = 1; সি মধ্যে সংকলন?


125

কোড:

int main(void)
{
    auto a=1;
    return 0;
}

এমএস ভিজ্যুয়াল স্টুডিও 2012 সংকলক দ্বারা ত্রুটি ছাড়াই সংকলিত হয়ে যায়, যখন ফাইলটিতে .c এক্সটেনশন থাকে। আমি সর্বদা ভেবেছি যে আপনি যখন .c এক্সটেনশনটি ব্যবহার করবেন তখন সংকলনটি সি সিনট্যাক্স অনুযায়ী হওয়া উচিত, সি ++ নয়। তদুপরি, যতদূর আমি জানি যে প্রকার ছাড়াই অটো কেবল সি ++ এ কেবলমাত্র সি ++ 11 এর মধ্যে অনুমোদিত , যেখানে এর অর্থ হ'ল প্রারম্ভিকটি থেকে টাইপটি বাদ দেওয়া হয়।

এর অর্থ কি এই যে আমার সংকলক সিটির সাথে লেগে নেই, বা কোডটি আসলে সি-ভাষায় সঠিক?


8
হয় আপনি সি ++ মোড (সম্ভাব্য) দিয়ে সংকলন করুন বা এমএস এখনও শেষ সহস্রাব্দে আটকে আছে। অন্তর্ভুক্তটি int1999 সালে সি স্ট্যান্ডার্ড থেকে সরানো হয়েছে
জেনস গুস্ট্ট

16
@ জেনসগাস্ট্ট এমএসভিসি ++ কেবলমাত্র সি 89 (এবং সি 99 এর কয়েকটি বৈশিষ্ট্য) সমর্থন করে। এটি আরও একটি সি ++ সংকলক।
ntoskrnl

3
@ ব্র্যান্ডিন: / ওয়াল বিকল্পের সাহায্যে এটি C4431 কে সতর্ক করে জানিয়েছে যে কোনও ধরণের স্পেসিফায়ার নেই এবং সে ডিফল্ট ইনট আর সি-তে সমর্থিত নয় (জেনসের মন্তব্য দেখুন)। স্পষ্টতই এই
সংকলকটি

4
@ জেনসগাস্ট্ট এই পরিমাপের দ্বারা, জিসিসি 4.7 প্রকাশিত হয়েছে 2012, (এবং পরবর্তী সংস্করণগুলিও, আমার সন্দেহ হয় - আমার কাছে এটি নেই) এছাড়াও "শেষ সহস্রাব্দে আটকে আছে"। এটি কোনও পতাকা দেওয়া না হয়েও কোনও বিজ্ঞপ্তি ছাড়াই ওপির কোড সংকলন করে।

3
@ ডেলান, আমি কমপক্ষে ধারণা করছিলাম, ওপি সতর্কতার মাত্রা পরিবর্তন করেছে। আমি অবশ্যই ভুল ছিল। এবং এক অর্থে এটি সত্য, জিসিসি এখনও সেখানে আটকে আছে, যেহেতু তাদের ডিফল্ট হিসাবে এখনও সি 99 (বা কোনও রূপ নেই) রয়েছে। ঝাঁকুনি এমনকি পতাকা ছাড়াই নির্মাণ সম্পর্কে সতর্ক করে।
জেনস গুস্ট্ট

উত্তর:


240

autoএকটি পুরানো সি কীওয়ার্ড যার অর্থ "স্থানীয় সুযোগ"। auto aহিসাবে একই auto int a, এবং যেহেতু স্থানীয় সুযোগটি কোনও ফাংশনের অভ্যন্তরে ঘোষিত ভেরিয়েবলের জন্য পূর্বনির্ধারিত, এটিও int aএই উদাহরণের মতো।

এই শব্দ আসলে সি এর পূর্বসুরী বি, যেখানে বেস ধরনের ছিল থেকে একটি অবশেষ হল: সবকিছু ছিল int, পয়েন্টার int, অ্যারে int(*) ঘোষণা হবে পারেন। autoঅথবা extrn[সিক]। সি intডিফল্ট নিয়ম হিসাবে "সমস্ত কিছু " উত্তরাধিকার সূত্রে প্রাপ্ত , যাতে আপনি এর সাথে পূর্ণসংখ্যার ঘোষণা করতে পারেন

auto a;
extern b;
static c;

আইএসও সি এ থেকে মুক্তি পেয়েছে, তবে অনেক সংকলক এখনও পশ্চাদপটে সামঞ্জস্যের জন্য এটি গ্রহণ করে। যদি এটি অপরিচিত মনে হয়, তবে আপনার বুঝতে হবে যে সম্পর্কিত নিয়মটি কাজ করছে

unsigned d;  // actually unsigned int

যা এখনও আধুনিক কোডে প্রচলিত।

সি ++ 11 কীওয়ার্ডটি পুনরায় ব্যবহার করেছে, যদি কোনও সি ++ প্রোগ্রামার তার টাইপ অনুমানের জন্য মূল অর্থটি ব্যবহার করে few এটি বেশিরভাগ ক্ষেত্রেই নিরাপদ কারণ intসি থেকে "সবকিছুই " নিয়মটি ইতিমধ্যে সি ++ 98 এ বাদ পড়েছিল; কেবল ভেঙে যাওয়ার বিষয়টি হ'ল auto T a, যা কেউ কোনওভাবেই ব্যবহার করে না। ( ভাষার ইতিহাস সম্পর্কে কোথাও তার কাগজপত্রগুলিতে , স্ট্রস্ট্রাপ এ সম্পর্কে মন্তব্য করেছেন, তবে এখনই সঠিক তথ্যসূত্রটি খুঁজে পাচ্ছি না।)

(*) বিতে স্ট্রিং হ্যান্ডলিংটি আকর্ষণীয় ছিল: আপনি intপ্রতিটি সদস্যের একাধিক অক্ষরের অ্যারে ব্যবহার এবং প্যাক করতে চান । বি আসলে বিভিন্ন সিনট্যাক্স সহ বিসিপিএল ছিল ।


7
না, এটি 1999 সাল থেকে আইনী সি নয় isn't কোনও শালীন আধুনিক সি সংকলক এটির জন্য অনুমতি দেয় না।
জেনস গুস্ট্ট

18
@ জেনসগাস্ট্ট ভিএস কোনও আধুনিক সি সংকলক সরবরাহ করার দাবি করে না। সমস্ত উপস্থিতি থেকে, সি সংকলকটির কাজ বহু বছর আগে বন্ধ হয়ে গেছে; তারা কেবল এটি সরবরাহ করে যাতে লোক লিগ্যাসি কোডটি সংকলন চালিয়ে যেতে পারে। (এবং অবশ্যই, কোন ভদ্র আধুনিক সি কম্পাইলার অপশন উত্তরাধিকার কোড সমর্থন করতে হবে কে & R এর সি জন্য একটি বিকল্প সহ।)
জেমস Kanze

23
@ জেনসগাস্ট্ট: আপনি কি নিশ্চিত? জিসিসি এবং ক্ল্যাং দুজনেই সি 99 মোডে এটি সম্পর্কে সতর্ক করে, তবে তারা এটিকে বাদ দিয়ে ত্রুটি বলে মনে করে না -Werror
ফ্রেড ফু

2
@ এলারসম্যান, হ্যাঁ, 7.7.২ এ এর ​​জন্য একটি স্পষ্ট প্রতিবন্ধকতা রয়েছে: প্রতিটি ঘোষণায় ঘোষিত স্পেসিফায়ারগুলিতে কমপক্ষে একটি ধরণের স্পেসিফায়ার দেওয়া হবে ...
জেনস গুস্ট্ট

40
@ জেনসগাস্ট্ট - পুনঃ না, এটি ১৯৯৯ সাল থেকে আইনী সি নয় No কোনও আধুনিক আধুনিক সি সংকলক এটির জন্য অনুমতি দেয় না। প্রথম বক্তব্য সঠিক; এটি ১৯৯৯ সাল থেকে অবৈধ IM আইএমএইচও, দ্বিতীয় বিবৃতিটি ভুল। যে কোনও শালীন আধুনিক সি সংকলক অবশ্যই এটির জন্য অনুমতি দেবে। সমস্ত লিগ্যাসি কোড দেখুন যা তারা যদি এটির অনুমতি না দেয় তবে আবার লিখতে হবে। আমি একটি উত্তর লিখেছি যা এই মন্তব্যে প্রসারিত।
ডেভিড হামেন

35

এটি একটি উত্তর এবং না উভয়ই বর্ধিত মন্তব্য , এটি 1999 সাল থেকে আইনী সি নয় No কোনও আধুনিক আধুনিক সি সংকলক এটির জন্য অনুমতি দেয় না।

হ্যাঁ, auto a=1;C1999 এ অবৈধ (এবং এছাড়াও সি ২০১১)। কেবল এখন এটি অবৈধ বলে এর অর্থ এই নয় যে একটি আধুনিক সি সংকলক এমন কোডগুলিকে প্রত্যাখ্যান করবে যা এই জাতীয় নির্মাণ রয়েছে। আমি ঠিক এর বিপরীতে তর্ক করব, যে একটি শালীন আধুনিক সি সংকলক এখনও অবশ্যই এটির জন্য অনুমতি দেয়।

ক্ল্যাং এবং জিসিসি উভয়ই সেই কাজটি করে যা স্ট্যান্ডার্ডের 1999 বা 2011 সংস্করণের বিপরীতে প্রশ্নে নমুনা কোডটি সংকলন করার সময়। উভয় সংকলকই একটি ডায়াগনস্টিক ইস্যু করে এবং তারপর আপত্তিজনক বক্তব্য ছিল এমনভাবে চালিয়ে যান auto int a=1;

আমার মতে, একটি শালীন সংকলক এটি করা উচিত। ডায়াগনস্টিক জারি করে, ঝনঝন এবং জিসিসি স্ট্যান্ডার্ডের সাথে সম্পূর্ণ সম্মতিযুক্ত। স্ট্যান্ডার্ডটি বলে না যে একটি সংকলক অবশ্যই অবৈধ কোড প্রত্যাখ্যান করবে। স্ট্যান্ডার্ডটি কেবল বলেছে যে কোনও অনুবাদ ইউনিটে কোনও সিনট্যাক্স নিয়ম বা সীমাবদ্ধতা লঙ্ঘন (5.1.1.3) অন্তর্ভুক্ত থাকলে একটি অনুসারী বাস্তবায়ন কমপক্ষে একটি ডায়াগনস্টিক বার্তা উত্পন্ন করতে হবে।

প্রদত্ত কোড যা অবৈধ নির্মাণ রয়েছে, যে কোনও শালীন সংকলক অবৈধ কোডটি বোঝার চেষ্টা করবে যাতে সংকলক কোডটিতে পরবর্তী ত্রুটি খুঁজে পেতে পারে। প্রথম ত্রুটিতে থামানো একটি সংকলক খুব ভাল সংকলক নয়। কিছু বোঝার উপায় আছে auto a=1যা "অন্তর্নিহিত ইনট" বিধি প্রয়োগ করা। এই নিয়মটি সংকলকটিকে ব্যাখ্যা করতে বাধ্য করে auto a=1যেন এটি auto int a=1যখন তখন ছিল যখন সংকলকটি C90 বা K&R মোডে ব্যবহৃত হয়েছিল।

বেশিরভাগ সংকলক সাধারণত কোড প্রত্যাখ্যান করেন না (প্রত্যাখ্যান করুন: কোনও অবজেক্ট ফাইল বা এক্সিকিউটেবল তৈরি করতে অস্বীকার করুন) এতে অবৈধ বাক্য গঠন রয়েছে। এটি এমন একটি ক্ষেত্রে যেখানে সংকলক লেখকরা সিদ্ধান্ত নিয়েছিলেন যে সংকলন করতে ব্যর্থ হবেন এটি সর্বোত্তম বিকল্প নয়। করণীয় হ'ল সর্বোত্তম বিষয় হ'ল ডায়াগনস্টিক ইস্যু করা, কোডটি ঠিক করা এবং চালিয়ে যাওয়া। এখানে কেবলমাত্র অনেক বেশি লিগ্যাসি কোড রয়েছে যা যেমন কনস্ট্রাক্টসের সাথে পেপারড হয়েছে register a=1;। সংকলকটি সি কোড বা সি 11 মোডে অবশ্যই কোডটি সংকলন করতে সক্ষম হবে (অবশ্যই একটি ডায়াগনস্টিক সহ)।


1
@ এলারসম্যানস - আমি দেখতে পাচ্ছি আপনি কোথায় থেকে এসেছেন। আপনি একটি -ffs-please-stop-allowing-constructs-from-some-previous-millenniumসংকলক বিকল্প, বা আরও সংক্ষেপে একটি -fstrict-complianceবিকল্প চান সংকলকটিতে গ্রুথিং: "যখন আমি -std = c11 ব্যবহার করতাম তখন আমি সেই প্রাচীন কেএন্ডআর ক্রুফ্টটি সংকলিত করার আশা করতাম না। আসলে, আমি চেয়েছিলাম এটি সংকলন না করে!"
ডেভিড হ্যামেন

1
আসলে না, আমি ঘুরে করতে চান উপর কম্পাইল করার খারাপ cruft পেতে একটি পতাকা। তবে আরও -std=c99কঠোর হওয়া সঠিক দিকের একটি পদক্ষেপ হতে পারে :)
ফ্রেড ফু

1
আপনি যদি ব্যবহার করেন gcc -g -O3 -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror(যা আমি নিয়মিত ব্যবহার করি, এমনকি এসও সংক্রান্ত প্রশ্নাবলীর কোডেও) তবে আপনি যা চান তার কাছে আপনি খুব কাছে চলে যান। আমি চাই যে জিসিসি কমপক্ষে -std=c99এবং অগ্রাধিকার হিসাবে ডিফল্ট হয়ে যায় -std=c11(বা, -std=gnu11তারা সম্ভবত এটি করতে পারে), তবে ততক্ষণে ... আপনি এই বিকল্পগুলিকে টুইঙ্ক করতে পারেন; -pedantic, -Wshadow, -Wold-style-declarationএবং কিছু অন্যদের দরকারী হতে পারে, কিন্তু এই একটি ভাল অপশন সেট শুরু হচ্ছে।
জোনাথন লেফলার

3
@ ডেভিডহ্যামেন: সাইক্লোমেটিক জটিলতা, প্রজেক্ট ম্যানেজার বা কোম্পানির পলিসি উভয়ই ভাষার উপাদান নয়।
জেরি বি

3
-pedantic-errors
জিসিসিতে

29

auto২০১১ এর স্ট্যান্ডার্ডের আগে Cএবং এর C++আগেও এর অর্থ রয়েছে । এর অর্থ হল কোনও ভেরিয়েবলের স্বয়ংক্রিয় জীবনকাল থাকে, অর্থাৎ আধিপত্য স্কোপ দ্বারা নির্ধারিত হয় । এটি যেমন, staticআজীবন বিরোধী , যেখানে কোনও পরিবর্তন যেমন সুযোগ ছাড়াই "চিরতরে" স্থায়ী হয়। autoএটি ডিফল্ট আজীবন এবং প্রায়শই স্পষ্টভাবে বর্ণিত হয় না। এ কারণেই এর অর্থটি পরিবর্তন করা নিরাপদ ছিল C++

এখন C, 99 স্ট্যান্ডার্ডের আগে আপনি যদি কোনও ভেরিয়েবলের ধরণ নির্দিষ্ট না করেন তবে এটি ডিফল্ট হয় int

সুতরাং আপনার সাথে auto a = 1;স্কোয়ার intদ্বারা আজীবন নির্ধারিত একটি পরিবর্তনশীল ঘোষণা (এবং সংজ্ঞায়িত) করা হচ্ছে।

("আজীবন" কে আরও সঠিকভাবে "স্টোরেজ সময়কাল" বলা হয় তবে আমি মনে করি এটি সম্ভবত কম পরিষ্কার)।


ঠিক আছে, সুতরাং প্রকৃতপক্ষে স্বয়ংক্রিয়ভাবে a = 1 এর সি অনুমোদিত এবং এর অর্থ স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ একটি পূর্ণ পরিবর্তনশীল।
lee77

1
সঠিকভাবে, "স্টোরেজ সময়কাল" মানগুলির তালিকার একটি, "স্বয়ংক্রিয়", "স্থিতিশীল", "গতিশীল", "থ্রেড" নেয়। "লাইফটাইম" হ'ল বস্তুর জীবনের আসল সময়। সুতরাং ভেরিয়েবলের স্টোরেজ সময়কাল "স্বয়ংক্রিয়" এবং আজীবন " mainফাংশনের সুযোগের সময়কাল " থাকে।
স্টিভ জেসপ

@ স্টিভ হ্যাঁ, আমি এটি বোঝাতে চাইনি autoএবং staticকেবল দুটি সম্ভাবনা। আমি আমার উত্তরটি অনুরোধকারীকে লক্ষ্য করে এমনভাবে লেখার চেষ্টা করছিলাম, যিনি C++(এবং C) এর কাছে বেশ নতুন বলে মনে হচ্ছে , তাই আমি বিবরণটি কিছুটা পর্যালোচনা করেছি। হতে পারে এটি একটি খারাপ ধারণা ছিল; এগুলি শীঘ্রই বা পরে আচ্ছাদন করা প্রয়োজন।
BoBTFish

1
@ বুবটি ফিশ: ওহ, আমি সে সম্পর্কে অভিযোগ করছিলাম না। আমি কেবল "আজীবন", যা একটি সময়কাল এবং "স্টোরেজ সময়কাল" এর মধ্যে অর্থগত পার্থক্যের উপর প্রসারিত করতে চেয়েছিলাম, যা সম্ভবত "স্টোরেজ সময়কালার বিভাগ" বলা যেতে পারে been
স্টিভ জেসপ

এই অন্তর্নিহিত intজিনিসগুলি 1999 সাল থেকে সি থেকে সরানো হয়েছে
জেনস গুস্ট্ট

8

সি তে, এবং সি ++ এর historicতিহাসিক উপভাষাগুলি autoএকটি কীওয়ার্ড যার অর্থ aস্বয়ংক্রিয় স্টোরেজ। যেহেতু এটি কেবলমাত্র স্থানীয় ভেরিয়েবলগুলিতে প্রয়োগ করা যেতে পারে, যা পূর্বনির্ধারিতভাবে স্বয়ংক্রিয় হয়, তাই কেউ এটিকে ব্যবহার করে না; যে কারণে সি ++ এখন কীওয়ার্ডটি পুনরায় প্রকাশ করেছে।

;তিহাসিকভাবে, সি কোনও ধরণের নির্দিষ্টকরণকারী ছাড়াই চলক ঘোষণাপত্রের অনুমতি দিয়েছে; টাইপ ডিফল্ট int। সুতরাং এই ঘোষণা সমতুল্য

int a=1;

আমি মনে করি এটি আধুনিক সিতে অবচয় (এবং সম্ভবত নিষিদ্ধ); তবে কিছু জনপ্রিয় সংকলক সি 90 এর ডিফল্ট (যা আমি মনে করি, এটি এর অনুমতি দেয়) এবং বিরক্তিকরভাবে কেবলমাত্র সতর্কবার্তা সক্ষম করুন যদি আপনি তাদের জন্য বিশেষভাবে জিজ্ঞাসা করেন। জিসিসির সাথে সংকলন করা এবং হয় সি 99 এর সাথে নির্দিষ্ট করা -std=c99, বা এর সাথে সতর্কতা সক্ষম করা -Wallবা -Wimplicit-intএকটি সতর্কতা দেয়:

warning: type defaults to int in declaration of a

4
এটি প্রকৃতপক্ষে 1999 সাল থেকে নিষিদ্ধ
জেনস গুস্ট্ট

5

সি তে, autoমানে registerসি ++ 11 এ একই জিনিস ঘটে: এর অর্থ একটি ভেরিয়েবলের স্বয়ংক্রিয় স্টোরেজ সময়কাল থাকে।

এবং সি 99 এর আগে সিতে (এবং মাইক্রোসফ্ট সংকলক সি 99 বা সি 11 সমর্থন করে না যদিও এটি এর অংশগুলি সমর্থন করতে পারে), প্রকারটি অনেক ক্ষেত্রেই বাদ দেওয়া যেতে পারে যেখানে এটি ডিফল্ট হবে int

এটি প্রারম্ভিকর থেকে মোটেও টাইপ নেয় না। আপনি কেবল একটি প্রারম্ভিকটি উপযুক্ত যা এটি উপযুক্ত pick


1
নিবন্ধক কীওয়ার্ডটি কি সি ++ 11 এ অবনতিযুক্ত নয়?
1:54 এ 10

@ সর্ডিড হ্যাঁ, এটি। সি ++ ১১ এর আগে autoএবং registerএর একই অর্থ ছিল (আমি আগে মন্তব্য করেছি যে একটি registerযোগ্য ভেরিয়েবলের ঠিকানা নেওয়ার ক্ষেত্রে বিধিনিষেধ ছিল , তবে এটি সি ++ এর জন্য ভুল ছিল)। registerঅবহেলিত অবস্থায়, আপাতত এর পুরানো অর্থ ধরে রেখেছে।

5
@ জেনসগাস্ট্ট: উত্তরটি তারা বলে না। এটি বলে যে autoসিতে registerসি ++ এর সমান অর্থ , যা এটি করে (উভয়ই স্বয়ংক্রিয় স্টোরেজ সময়কাল এবং অন্য কিছুই নয়)।
মাইক সিউমর

3

ভিজ্যুয়াল স্টুডিও সংকলনের ধরণ পাওয়া যায় right click on file -> Properties -> C/C++ -> Advanced -> Compile As। এটি সি ফোর্স বিকল্প হিসাবে সংকলিত হয়েছে তা নিশ্চিত করার জন্য /TCthis এক্ষেত্রে লারসম্যানরা যা বলেছে তা (পুরানো সি autoকীওয়ার্ড)। এটি আপনার অজান্তেই সি ++ হিসাবে সংকলিত হতে পারে।


3

একটি স্টোরেজ শ্রেণি একটি সি প্রোগ্রামের মধ্যে ভেরিয়েবল এবং / অথবা ফাংশনগুলির জীবনকাল (দৃশ্যমানতা) এবং জীবনকালকে সংজ্ঞায়িত করে।

নীচের স্টোরেজ ক্লাস রয়েছে যা একটি সি প্রোগ্রামে ব্যবহার করা যেতে পারে

auto
register
static
extern

auto সমস্ত স্থানীয় ভেরিয়েবলের জন্য ডিফল্ট স্টোরেজ শ্রেণি।

{
        int Count;
        auto int Month;
}

উপরের উদাহরণটি একই স্টোরেজ শ্রেণীর সাথে দুটি ভেরিয়েবল সংজ্ঞায়িত করে। অটো কেবলমাত্র ফাংশনগুলির মধ্যে, যেমন স্থানীয় ভেরিয়েবলের মধ্যে ব্যবহার করা যেতে পারে।

intautoনীচের কোডের জন্য ডিফল্ট টাইপ :

auto Month;
/* Equals to */
int Month;

কোডের নীচেও আইনী:

/* Default-int */
main()
{
    reurn 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.