প্রধান () সি এবং সি ++ এ কী হওয়া উচিত?


694

সঠিক (সবচেয়ে বেশি কার্যকরী) উপায় নির্ধারণ করতে কী main()- সি এবং C ++ ফাংশন int main()বা void main()- এবং কেন? তাহলে int main()তারপর return 1বা return 0?


এই প্রশ্নের অসংখ্য নকল রয়েছে, সহ:

সম্পর্কিত:


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

7
ইতিমধ্যে, দক্ষতার প্রসঙ্গটি এখানে স্পষ্টতই উদাহরণস্বরূপ (যা সম্ভবত 'দক্ষ' এর সংজ্ঞাটি স্পষ্ট করে দিতে পারে) with আশা করি দরিদ্র বাফার কোনও গর্তের মধ্যে হামাগুড়ি না দিয়ে প্রশ্নটি পুরোপুরি অনুশোচনা করছে। কেউ বলতে পারেন, অকার্যকর বা ইনট নির্বিশেষে, একটি মান ফিরে আসে, সুতরাং এটি ফাইলের আকার, ক্রিয়াকলাপ কার্যকর, এবং বরাদ্দ মেমরির কোনও প্রভাব ফেলবে না। এবং বেশিরভাগ ওএস জুড়ে লোকেরা সাফল্যে 0 এবং অন্য কিছু - সাফল্য বা ব্যর্থতার দিকে ঝুঁকেন - তবে এর কোনও মান নেই। শেষ পর্যন্ত, কোনও সুস্পষ্ট উপায়ে দক্ষতার কোনও পার্থক্য নেই।
কিট

"সঠিক (সবচেয়ে দক্ষ)" এর কোনও অর্থ নেই make দক্ষ একটি জিনিস, সঠিক অন্য জিনিস। mainএকবার বলা হয় (এবং সি ++ এ কেবল একবার কল করা যেতে পারে: কোনও পুনরাবৃত্তি নয়)। আপনি যদি মৃত্যুদণ্ড কার্যকর করতে চান না mainতবে প্রচুর পরিমাণে প্রোগ্রামটি শুরু করবেন না: প্রোগ্রামটি পুনরাবৃত্তি বাস্তবায়ন করুন।
কাজ

2
আমি এটা, উত্তর যে কেউ যত মজার যতদূর আমি বলতে পারি এটি একটি সম্পূর্ণরূপে কাজ উদাহরণ প্রদান সহ #includeবিবৃতি
PUK

3
রিটার্ন মানগুলি কোনও ওএস ছাড়াই প্ল্যাটফর্মে কোনও অর্থ দেয় না। আপনি কোন কিছুতে ফিরছেন না যদি আপনি একটি এম্বেড থাকা ডিভাইসে একটি হিট returnকরেন তবে main(...)আপনার সিস্টেমটি একটি অবিশ্বাস্য অবস্থায় চলে যায় এবং আপনার ওয়াশিং মেশিনটি আত্ম-সচেতন হয়ে আপনাকে হত্যা করার চেষ্টা করবে। সুতরাং, আমরা void main()সেই ক্ষেত্রে ব্যবহার করি । এটি বেয়ার-মেটাল এমবেড করাতে শিল্প মান অনুশীলন।
ডিভে

উত্তর:


569

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

int main()

এবং

int main(int argc, char* argv[])

যা সমান

int main(int argc, char** argv)

এটিও লক্ষণীয় যে সি ++ তে int main()কোনও রিটার্ন-বিবৃতি ছাড়াই ছেড়ে দেওয়া যেতে পারে, যার পয়েন্টে এটি 0 ফেরার ক্ষেত্রে ডিফল্ট হয় C এটি একটি সি 99 প্রোগ্রামের সাথেও সত্য। return 0;বাদ দেওয়া উচিত কিনা তা বিতর্কের জন্য উন্মুক্ত। বৈধ সি প্রোগ্রামের প্রধান স্বাক্ষরের পরিধিটি আরও বেশি।

দক্ষতা mainফাংশন কোন সমস্যা নয় । এটি কেবলমাত্র সি ++ স্ট্যান্ডার্ড অনুসারে একবার প্রবেশ করা যাবে এবং ছেড়ে দেওয়া যাবে (প্রোগ্রামের শুরু এবং সমাপ্তির চিহ্ন হিসাবে)। সি এর জন্য, পুনরায় প্রবেশের main()অনুমতি দেওয়া হলেও এড়ানো উচিত।


69
মূল একাধিকবার প্রবেশ / বাম প্রবেশ করা যেতে পারে, তবে সেই প্রোগ্রামটি সম্ভবত কোনও ডিজাইনের পুরষ্কার জিততে পারে না;)
কোরোনা

13
সি 99 এর সি ++ এর ভুল বৈশিষ্ট্যটিও রয়েছে যে মূল () ফাংশনের শেষ প্রান্তে 0 পৌঁছানোর সমতুল্য হয় - যদি প্রধান () সংজ্ঞাযুক্ত (টাইপ 5.1.2.2.3) এর সাথে সামঞ্জস্যপূর্ণ কোনও প্রকার ফেরত দিতে সংজ্ঞায়িত হয়।
জোনাথন লেফলার

62
মূল পুনরায় প্রবেশ করানো বৈধ সি ++ নয়। স্ট্যান্ডার্ডে স্পষ্টতই, ৩.6.১.৩ বলছে 'মূল কোনও প্রোগ্রামের মধ্যে ব্যবহার করা হবে না'
workmad3

117
stdlib.h এই উদ্দেশ্যে EXIT_SUCCESS এবং EXIT_FAILURE সরবরাহ করে
ক্লে

20
0 এবং অ-শূন্যটি সঠিক তবে আপনার কোডটি পড়ার জন্য সম্পূর্ণ অর্থহীন। এই প্রশ্নটি প্রমাণ হয় যে লোকেদের বৈধ / অবৈধ কোডগুলি কী তা জানেন না। EXIT_SUCCESS / EXIT_FAILURE আরও স্পষ্ট।
জারেডপাড়

169

গৃহীত উত্তরটি সি ++ এর জন্য লক্ষ্যযুক্ত বলে মনে হচ্ছে, তাই আমি ভেবেছিলাম যে আমি সি এর সাথে সম্পর্কিত একটি উত্তর যুক্ত করব এবং এটি কয়েকটি উপায়ে পৃথক।

আইএসও / আইইসি 9899: 1989 (সি 90):

main() উভয় হিসাবে ঘোষণা করা উচিত:

int main(void)
int main(int argc, char **argv)

বা সমমানের. উদাহরণস্বরূপ, int main(int argc, char *argv[])দ্বিতীয়টির সমান। তদ্ব্যতীত, intরিটার্নের ধরণটি ডিফল্ট হিসাবে বাদ দেওয়া যেতে পারে।

যদি কোনও বাস্তবায়ন এটির অনুমতি দেয়, main() অন্যান্য উপায়ে ঘোষণা করা যেতে পারে, তবে এটি প্রোগ্রামের বাস্তবায়নকে সংজ্ঞায়িত করে তোলে এবং কঠোরভাবে মেনে চলে না।

মানটি কঠোরভাবে মেনে চলার জন্য ফিরে আসার জন্য 3 টি মানকে সংজ্ঞায়িত করে (এটি বাস্তবায়িত সংজ্ঞায়িত আচরণের উপর নির্ভর করে না): 0এবং EXIT_SUCCESSএকটি সফল সমাপ্তির জন্য, এবং EXIT_FAILUREএকটি ব্যর্থ সমাপ্তির জন্য। অন্য যে কোনও মান মানহীন এবং বাস্তবায়ন সংজ্ঞায়িত। অপরিজ্ঞাত আচরণ এড়ানোর জন্য main()অবশ্যই অবশ্যই একটি স্পষ্ট returnবক্তব্য থাকতে হবে।

শেষ অবধি, main()কোনও প্রোগ্রাম থেকে কল করার সাথে মানদণ্ডের দৃষ্টিকোণ থেকে কোনও ভুল নেই ।

আইএসও / আইইসি 9899: 1999 (সি 99):

সি 99 এর জন্য, সমস্ত কিছুই উপরের মত একই:

  • intরিটার্ন টাইপ বাদ দেওয়া নাও হতে পারে।
  • আপনি রিটার্নের বিবৃতি বাদ দিতে পারেন main()। যদি আপনি এটি করেন এবং main()শেষ করেন তবে একটি অন্তর্নিহিত রয়েছে return 0

1
@ লন্ডিন আমার মনে হয় না যে আপনাকে এমন একটি সংকলক তৈরি করার অনুমতি দেওয়া হয়েছে যা মানহীন-অনুসরনকারী প্রোগ্রামগুলি গ্রহণ করে, বা একটি স্টারার্ড-কনফর্মিং সংকলক রাখার অনুমতি দেওয়া হয়। এটি সাধারণ জ্ঞান এবং সাধারণ জ্ঞান
KABoissonneault

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

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

2
@ কেবিওসননিয়েল্ট আমার মন্তব্যে যে অংশটি উদ্ধৃত করেছি তা অবশ্যই বাস্তবায়ন-সংজ্ঞায়িত আচরণ সম্পর্কে ( অ-মানক সংকলক বর্ধনের বিপরীতে )) সুতরাং আমি বাস্তবায়ন-সংজ্ঞায়িত আচরণের বিষয়ে কথা বলছি। আপনার যদি অন্য কোনও বিষয় নিয়ে একাকীত্ব থাকে, তবে এটির সাথে শুভকামনা।
লন্ডিন

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

117

স্ট্যান্ডার্ড সি - হোস্ট করা পরিবেশ

একটি হোস্ট করা পরিবেশের জন্য (এটি সাধারণ একটি), সি 11 স্ট্যান্ডার্ড (আইএসও / আইইসি 9899: 2011) বলেছেন:

5.1.2.2.1 প্রোগ্রাম সূচনা

প্রোগ্রাম স্টার্টআপ নামক ফাংশনটির নাম দেওয়া হয়েছে main। বাস্তবায়ন এই ফাংশনের জন্য কোনও প্রোটোটাইপ ঘোষণা করে না। এটি কোনও রিটার্ন ধরণের intএবং কোনও পরামিতি ছাড়াই সংজ্ঞায়িত করা হবে :

int main(void) { /* ... */ }

বা দুটি প্যারামিটার সহ (এখানে হিসাবে উল্লেখ করা হয় argcএবং argv, যদিও কোনও নাম ব্যবহার করা যেতে পারে, কারণ তারা যে ফাংশনটিতে তারা ঘোষিত হয় তেমন স্থানীয়):

int main(int argc, char *argv[]) { /* ... */ }

বা সমমানের; 10) বা অন্য কোনও বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে।

যদি সেগুলি ঘোষিত হয় তবে মূল ফাংশনের প্যারামিটারগুলি নিম্নলিখিত সীমাবদ্ধতাগুলি মেনে চলবে:

  • মান argcহ'ল ননজেটিভ।
  • argv[argc] একটি নাল পয়েন্টার হতে হবে।
  • মানটি যদি argcশূন্যের চেয়ে বেশি argv[0]হয় তবে argv[argc-1]অন্তর্ভুক্তির মাধ্যমে অ্যারে সদস্যগুলির মধ্যে স্ট্রিংয়ের পয়েন্টার থাকতে হবে যা প্রোগ্রাম শুরু হওয়ার আগে হোস্ট পরিবেশ দ্বারা বাস্তবায়ন-সংজ্ঞায়িত মান দেওয়া হয়। উদ্দেশ্যটি হ'ল পরিবেশযুক্ত পরিবেশে অন্য কোথাও থেকে প্রোগ্রাম শুরু হওয়ার আগে নির্ধারিত প্রোগ্রামের তথ্য সরবরাহ করা। হোস্ট এনভায়রনমেন্ট যদি বড় হাতের এবং ছোট হাতের অক্ষরে অক্ষর দিয়ে স্ট্রিং সরবরাহ করতে সক্ষম না হয় তবে বাস্তবায়ন নিশ্চিত করে যে স্ট্রিংগুলি ছোট হাতের মধ্যে প্রাপ্ত হয়েছে।
  • মানটি যদি argcশূন্যের চেয়ে বেশি হয় তবে নির্দেশিত স্ট্রিং argv[0] প্রোগ্রামটির নাম উপস্থাপন করে; argv[0][0]হোস্ট পরিবেশ থেকে প্রোগ্রামের নামটি উপলব্ধ না হলে নাল অক্ষর হবে। তাহলে এর মান argcএক চেয়ে অনেক বেশী, স্ট্রিং দ্বারা প্রতি ইঙ্গিত argv[1]মাধ্যমে argv[argc-1] প্রোগ্রাম পরামিতি প্রতিনিধিত্ব করে।
  • অ্যারে দ্বারা নির্দেশিত প্যারামিটারগুলি argcএবং argvস্ট্রিংগুলি argvপ্রোগ্রাম দ্বারা পরিবর্তনযোগ্য হবে এবং প্রোগ্রাম স্টার্টআপ এবং প্রোগ্রাম সমাপ্তির মধ্যে তাদের শেষ-সঞ্চিত মান বজায় রাখতে পারে।

10) সুতরাং, intসংজ্ঞায়িত টাইপএফ নাম দ্বারা প্রতিস্থাপন করা যেতে পারে int, বা প্রকারের argvমতো লিখতে char **argvপারেন ইত্যাদি।

সি 99 বা সি 11 এ প্রোগ্রাম সমাপ্তি

প্রত্যাবর্তিত মানটি main()বাস্তবায়ন-সংজ্ঞায়িত উপায়ে 'পরিবেশে' প্রেরণ করা হয়।

5.1.2.2.3 প্রোগ্রাম সমাপ্তি

1 যদি mainফাংশনের রিটার্ন ধরণের সাথে সামঞ্জস্যপূর্ণ টাইপ intহয় তবে প্রাথমিক কল থেকে mainফাংশনে exitফিরে আসা mainফাংশনটিকে তার আর্গুমেন্ট হিসাবে ফিরিয়ে দেওয়া মান দিয়ে কল করার সমতুল্য ; ১১) ফাংশনটি সমাপ্ত হওয়াতে পৌঁছানো ০ এর মান }দেয় the mainযদি রিটার্ন টাইপের সাথে সামঞ্জস্য না intহয় তবে হোস্ট পরিবেশে ফিরে আসা সমাপ্তির স্থিতি অনির্দিষ্ট।

১১) .2.২.৪ অনুসারে, ঘোষিত স্বয়ংক্রিয় স্টোরেজ সময়কালের সাথে অবজেক্টগুলির জীবনকাল main পূর্ববর্তী ক্ষেত্রে শেষ হয়ে যাবে, এমনকি যেখানে তাদের উত্তর নেই।

লক্ষ্য করুন 0'সাফল্য' হিসেবে বাধ্যতামূলক করা হয়। আপনি ব্যবহার করতে পারেন EXIT_FAILUREএবং EXIT_SUCCESSথেকে <stdlib.h>আপনি যদি চান, কিন্তু 0 সুপ্রতিষ্ঠিত হয়, এবং তাই 1. দেখুন হয় প্রস্থান করুন কোডের চেয়ে 255 বৃহত্তর - কি সম্ভব?

C89-তে (এবং তাই মাইক্রোসফ্ট সি-তে), main()ফাংশনটি ফিরে আসে তবে কোনও রিটার্নের মান নির্দিষ্ট করে না তবে কী হয় সে সম্পর্কে কোনও বিবৃতি নেই; সুতরাং এটি অপরিবর্তিত আচরণের দিকে পরিচালিত করে।

7.22.4.4 exitফাংশন

Finally5 অবশেষে, নিয়ন্ত্রণ হোস্ট পরিবেশে ফিরে আসে। মানটি statusযদি শূন্য হয় বা EXIT_SUCCESS, স্থিতি সফল সমাপ্তির একটি বাস্তবায়ন-সংজ্ঞায়িত ফর্মটি ফিরে আসে। যদি এর মান statusহয় EXIT_FAILUREতবে স্থিতির অসমাপ্ত সমাপ্তির একটি বাস্তবায়ন-সংজ্ঞায়িত ফর্মটি ফেরত দেওয়া হয়। অন্যথায় স্থিতিটি বাস্তবায়ন-সংজ্ঞায়িত।

স্ট্যান্ডার্ড সি ++ - হোস্ট করা পরিবেশ

সি ++ 11 স্ট্যান্ডার্ড (আইএসও / আইইসি 14882: 2011) বলেছেন:

৩.6.১ মূল ফাংশন [বেসিক.স্টার্ট.মাইন]

¶1 একটি প্রোগ্রামে মূল নামে একটি বিশ্বব্যাপী ফাংশন থাকবে যা প্রোগ্রামটির মনোনীত শুরু। [...]

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

int main() { /* ... */ }

এবং

int main(int argc, char* argv[]) { /* ... */ }

পরবর্তী আকারে argcপ্রোগ্রামটি পরিবেশিত হয় এমন পরিবেশ থেকে প্রোগ্রামটিতে পাস হওয়া আর্গুমেন্টের সংখ্যা হবে। যদি argcহয় অশূন্য এই আর্গুমেন্ট মধ্যে সরবরাহ করা হইবে argv[0] মাধ্যমে argv[argc-1]নাল-সমাপ্ত multibyte স্ট্রিং প্রাথমিক অক্ষর (NTMBSs) (17.5.2.1.4.2) পয়েন্টার এবং argv[0]একটি NTMBS প্রাথমিক অক্ষরে পয়েন্টার যে করার জন্য ব্যবহৃত নাম প্রতিনিধিত্ব করে হইবে প্রোগ্রাম প্রার্থনা বা ""। এর মান argcঅ-নেতিবাচক হবে। মান হতে argv[argc] হবে 0। [দ্রষ্টব্য: এটির পরে আরও (alচ্ছিক) পরামিতি যুক্ত করার পরামর্শ দেওয়া হয় argv। অন্তর্ভুক্ত নোট]

.3 ফাংশনটি mainকোনও প্রোগ্রামের মধ্যে ব্যবহার করা হবে না। এর যোগসূত্রটি (3.5) mainবাস্তবায়ন-সংজ্ঞায়িত। [...]

¶5 মূলত একটি রিটার্ন স্টেটমেন্টের মূল ফাংশন (স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ কোনও বস্তু ধ্বংস) এবং std::exitআর্গুমেন্ট হিসাবে রিটার্ন মান সহ কল করার প্রভাব রয়েছে । রিটার্নের বিবৃতি না পেয়ে নিয়ন্ত্রণ যদি প্রধানের শেষ প্রান্তে পৌঁছায় তবে প্রভাব কার্যকর হয়

return 0;

সি ++ স্ট্যান্ডার্ড স্পষ্টভাবে বলেছে "এটি [মূল ফাংশন] এর একটি রিটার্ন টাইপ থাকতে হবে int, তবে অন্যথায় এর ধরণটি বাস্তবায়ন সংজ্ঞায়িত করা হয়", এবং সি স্ট্যান্ডার্ড হিসাবে একই দুটি স্বাক্ষর অপশন হিসাবে সমর্থিত হওয়া দরকার। সুতরাং একটি 'অকার্যকর মেইন ()' সি ++ স্ট্যান্ডার্ড দ্বারা সরাসরি অনুমোদিত নয়, যদিও বিকল্পের অনুমতি দিয়ে অ-মানক বাস্তবায়ন বন্ধ করতে এর কিছুই করতে পারে না। নোট করুন যে সি ++ ব্যবহারকারীকে কল করতে নিষেধ করেছে main(তবে সি স্ট্যান্ডার্ডটি তা করে না)।

সেখানে §18.5 একটি অনুচ্ছেদ এর স্টার্ট এবং পরিসমাপ্তি সি 11 মান মধ্যে ++, যে §7.22.4.4 থেকে অনুচ্ছেদে অভিন্ন ফাংশন C11 মান মধ্যে (উপরে উদ্ধৃত), পৃথক্ একটি পাদটীকা থেকে (যা কেবল যে দস্তাবেজগুলি এবং সংজ্ঞায়িত করা হয় in )।exitEXIT_SUCCESSEXIT_FAILURE<cstdlib>

স্ট্যান্ডার্ড সি - কমন এক্সটেনশন

শাস্ত্রীয়ভাবে, ইউনিক্স সিস্টেমগুলি একটি তৃতীয় বৈকল্পিক সমর্থন করে:

int main(int argc, char **argv, char **envp) { ... }

তৃতীয় আর্গুমেন্টটি হল স্ট্রিংগুলিতে পয়েন্টারগুলির একটি নাল-টার্মিনেটেড তালিকা, যার প্রত্যেকটি একটি পরিবেশের ভেরিয়েবল যার একটি নাম, সমান চিহ্ন এবং মান (সম্ভবত শূন্য) রয়েছে। আপনি যদি এটি ব্যবহার না করেন তবে ' extern char **environ;' এর মাধ্যমে আপনি পরিবেশে পেতে পারেন । এই গ্লোবাল ভেরিয়েবলটি পসিক্সের মধ্যে এটির মধ্যেই অনন্য that

এটি আনেকেক্স জে নথিভুক্ত সাধারণ মান হিসাবে সি স্ট্যান্ডার্ড দ্বারা স্বীকৃত:

J.5.1 পরিবেশ যুক্তি

¶1 একটি হোস্ট করা পরিবেশে, মূল ফাংশনটি একটি তৃতীয় যুক্তি পায় char *envp[], যা পয়েন্টারগুলির একটি নাল-টার্মিনেটেড অ্যারে নির্দেশ charকরে, যার প্রত্যেকটি একটি স্ট্রিংকে নির্দেশ করে যা প্রোগ্রামটির এই সম্পাদনের জন্য পরিবেশ সম্পর্কে তথ্য সরবরাহ করে (5.1)। 2.2.1)।

মাইক্রোসফ্ট সি

মাইক্রোসফট বনাম 2010 কম্পাইলার আকর্ষণীয়। ওয়েব সাইটটি বলে:

মূল জন্য ঘোষণার বাক্য গঠন

 int main();

বা, allyচ্ছিকভাবে,

int main(int argc, char *argv[], char *envp[]);

বিকল্পভাবে, mainএবং wmainফাংশনগুলি voidরিটার্ন হিসাবে ঘোষণা করা যেতে পারে (কোনও ফেরতের মূল্য নেই)। আপনি যদি ঘোষিত হন mainবা wmainপ্রত্যাবর্তন শূন্য হিসাবে ঘোষণা করেন , আপনি কোনও রিটার্ন স্টেটমেন্ট ব্যবহার করে প্যারেন্ট প্রসেস বা অপারেটিং সিস্টেমে একটি প্রস্থান কোড ফেরত দিতে পারবেন না। যখন বহিরাগত কোডটি প্রকাশিত হবে mainবা wmainহিসাবে ঘোষিত voidহবে, আপনাকে অবশ্যই exitফাংশনটি ব্যবহার করতে হবে ।

আমার সাথে এটি স্পষ্ট নয় যে যখন কোনও প্রোগ্রাম void main()প্রস্থান করে তখন কী ঘটে (কোন প্রস্থান কোডটি প্যারেন্ট বা OS এ ফিরে আসে) - এবং এমএস ওয়েবসাইটটিও নীরব।

মজার বিষয় হল, এমএস main()সি এবং সি ++ মানের যে দ্বি-যুক্তির সংস্করণটি প্রয়োজন সেগুলি লিখে দেয় না । এটি কেবলমাত্র তিনটি আর্গুমেন্ট ফর্ম নির্ধারণ করে যেখানে তৃতীয় আর্গুমেন্ট char **envp, পরিবেশের ভেরিয়েবলগুলির তালিকার একটি পয়েন্টার।

মাইক্রোসফ্ট পৃষ্ঠায় কিছু অন্যান্য বিকল্পের তালিকাও রয়েছে - wmain()যা প্রশস্ত চরিত্রের স্ট্রিং গ্রহণ করে এবং আরও কিছু।

এই পৃষ্ঠার মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2005 সংস্করণটি বিকল্প হিসাবে তালিকাভুক্ত নয় । মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও ২০০৮ এর সংস্করণগুলি এখনও তা করে।void main()

স্ট্যান্ডার্ড সি - ফ্রিস্ট্যান্ডিং পরিবেশ

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

5.1.2 কার্যকর করার পরিবেশ

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

5.1.2.1 ফ্রয়েস্ট্যান্ডিং পরিবেশ

একটি ফ্রিস্ট্যান্ডিং পরিবেশে (যে ক্ষেত্রে অপারেটিং সিস্টেমের কোনও সুবিধা ছাড়াই সি প্রোগ্রাম কার্যকর করা যেতে পারে), প্রোগ্রাম স্টার্টআপে ডাকা ফাংশনের নাম এবং প্রকারটি বাস্তবায়ন-সংজ্ঞায়িত। ধারা 4 দ্বারা প্রয়োজনীয় ন্যূনতম সেট ব্যতীত কোনও ফ্রিস্ট্যান্ডিং প্রোগ্রামে উপলব্ধ যে কোনও গ্রন্থাগার সুবিধা বাস্তবায়ন-সংজ্ঞায়িত।

ফ্রিস্ট্যান্ডিং পরিবেশে প্রোগ্রামের সমাপ্তির প্রভাব বাস্তবায়ন-সংজ্ঞায়িত।

ধারা ৪ কনফারেন্সের ক্রস-রেফারেন্স এটিকে বোঝায়:

¶5 একটি কঠোরভাবে মেনে চলার প্রোগ্রামটিতে এই আন্তর্জাতিক স্ট্যান্ডার্ডে বর্ণিত ভাষা এবং গ্রন্থাগারের কেবল সেই বৈশিষ্ট্যই ব্যবহার করা উচিত। 3) এটি কোনও অনির্ধারিত, অপরিজ্ঞাত বা বাস্তবায়ন-সংজ্ঞায়িত আচরণের উপর নির্ভরশীল আউটপুট উত্পাদন করবে না এবং কোনও ন্যূনতম বাস্তবায়ন সীমা ছাড়িয়ে যাবে না।

¶6 অনুসারে বাস্তবায়নের দুটি ফর্ম হোস্ট করা এবং ফ্রিস্ট্যান্ডিং । একটি অনুসারী হোস্টিং বাস্তবায়ন যে কোনও কঠোরভাবে মেনে চলার প্রোগ্রাম গ্রহণ করবে। একজন অনুসারী freestanding বাস্তবায়ন কোনো কঠোরভাবে অনুসারী প্রোগ্রাম যা গ্রন্থাগার দফা (ধারা 7) উল্লেখিত বৈশিষ্ট্যের ব্যবহার মান হেডার বিষয়বস্তুর সীমাবদ্ধ হয় গ্রহণ করিবে <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, এবং <stdnoreturn.h>। একটি মেনে চলার বাস্তবায়নের এক্সটেনশন (অতিরিক্ত গ্রন্থাগার ফাংশন সহ) থাকতে পারে, তবে তারা কোনও কঠোরভাবে মেনে চলার প্রোগ্রামের আচরণকে পরিবর্তন না করে। 4)

¶7 একটি কনফার্মিং প্রোগ্রাম হ'ল যা একটি অনুসারী বাস্তবায়নের জন্য গ্রহণযোগ্য। 5)

3) একটি কঠোরভাবে মেনে চলার প্রোগ্রামটি শর্তাধীন বৈশিষ্ট্যগুলি (6.10.8.3 দেখুন) ব্যবহার করতে পারে তবে সরবরাহটি সম্পর্কিত ম্যাক্রো ব্যবহার করে উপযুক্ত শর্তযুক্ত অন্তর্ভুক্তি প্রিপ্রোসেসিং নির্দেশিকা দ্বারা রক্ষিত থাকে। উদাহরণ স্বরূপ:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

৪) এর দ্বারা বোঝা যায় যে একটি আনুগত্য বাস্তবায়ন এই আন্তর্জাতিক স্ট্যান্ডার্ডে স্পষ্টভাবে সংরক্ষিত ছাড়া অন্য কোনও সনাক্তকারী সংরক্ষণ করে না।

5) কঠোরভাবে মেনে চলার প্রোগ্রামগুলি বাস্তবায়ন বাস্তবায়নের মধ্যে সর্বাধিক বহনযোগ্য হতে চলেছে। মেনে চলার প্রোগ্রামগুলি মাপসই বাস্তবায়নের অ-বহনযোগ্য বৈশিষ্ট্যগুলির উপর নির্ভর করে।

এটি লক্ষণীয় যে কেবলমাত্র একটি ফ্রিস্ট্যান্ডিং পরিবেশের প্রয়োজন যা কেবল কোনও ফাংশনকে সংজ্ঞায়িত করে <stdarg.h>(এবং এমনকি এটিগুলি হতে পারে - এবং প্রায়শই - কেবল ম্যাক্রোগুলি)।

স্ট্যান্ডার্ড সি ++ - ফ্রিস্ট্যান্ডিং পরিবেশ

সি স্ট্যান্ডার্ড যেমন আয়োজিত এবং ফ্রিস্ট্যান্ডিং পরিবেশ উভয়কেই স্বীকৃতি দেয় তেমনই সি ++ স্ট্যান্ডার্ডটিও করে। (আইএসও / আইসিসি থেকে উদ্ধৃতি 14882: 2011।)

1.4 বাস্তবায়ন সম্মতি [intro.comp Equipment]

.7 দুটি ধরণের বাস্তবায়ন সংজ্ঞায়িত করা হয়: একটি হোস্টেড বাস্তবায়ন এবং একটি ফ্রিস্ট্যান্ডিং বাস্তবায়ন । একটি হোস্টেড প্রয়োগের জন্য, এই আন্তর্জাতিক স্ট্যান্ডার্ড উপলব্ধ গ্রন্থাগারগুলির সেটকে সংজ্ঞায়িত করে। একটি ফ্রিস্ট্যান্ডিং বাস্তবায়ন হ'ল একটি অপারেটিং সিস্টেমের সুবিধা ছাড়াই কার্যকর করা যেতে পারে এবং এর জন্য একটি প্রয়োগ-সংজ্ঞায়িত গ্রন্থাগার রয়েছে যা কিছু নির্দিষ্ট ভাষা-সমর্থন লাইব্রেরি (17.6.1.3) অন্তর্ভুক্ত করে।

¶8 একটি মেনে চলার বাস্তবায়নের এক্সটেনশন (অতিরিক্ত গ্রন্থাগার ফাংশন সহ) থাকতে পারে তবে শর্ত থাকে যে তারা কোনও সুগঠিত প্রোগ্রামের আচরণের পরিবর্তন না করে। এই আন্তর্জাতিক স্ট্যান্ডার্ড অনুসারে এই জাতীয় এক্সটেনশানগুলি ব্যবহার করে যা দুর্বৃত্ত রয়েছে এমন প্রোগ্রামগুলি নির্ণয়ের জন্য প্রয়োগগুলি প্রয়োজন are তবে এটি করার পরে তারা এ জাতীয় প্রোগ্রামগুলি সংকলন ও সম্পাদন করতে পারে।

Implementation9 প্রতিটি বাস্তবায়নের মধ্যে ডকুমেন্টেশন অন্তর্ভুক্ত থাকবে যা শর্তাধীন-সমর্থিত সমস্ত কনস্ট্রাক্টসকে সনাক্ত করে যা এটি স্থানীয়ভাবে নির্দিষ্ট বৈশিষ্ট্যগুলি সমর্থন করে না এবং সংজ্ঞা দেয়। 3

3) এই ডকুমেন্টেশন বাস্তবায়ন সংজ্ঞায়িত আচরণও সংজ্ঞায়িত করে; 1.9 দেখুন।

17.6.1.3 নিখরচায় বাস্তবায়ন [সম্মতি]

দুটি ধরণের বাস্তবায়ন সংজ্ঞায়িত করা হয়: হোস্টেড এবং ফ্রিস্ট্যান্ডিং (1.4)। হোস্টেড প্রয়োগের জন্য, এই আন্তর্জাতিক স্ট্যান্ডার্ডটি উপলব্ধ শিরোনামগুলির সেটটি বর্ণনা করে।

একটি ফ্রিস্ট্যান্ডিং বাস্তবায়নে একটি শিরোনামের প্রয়োগ-সংজ্ঞায়িত সেট থাকে। এই সেটটিতে সারণী 16-এ প্রদর্শিত কমপক্ষে শিরোনাম অন্তর্ভুক্ত করা উচিত।

শিরোনামের সরবরাহকৃত সংস্করণ <cstdlib>ঘোষণা করবে অন্তত ফাংশন abort, atexit, at_quick_exit, exit, এবং quick_exit(18.5)। এই টেবিলের তালিকাভুক্ত অন্যান্য শিরোনামগুলি হোস্টেড বাস্তবায়ন হিসাবে একই প্রয়োজনীয়তাগুলি পূরণ করবে।

সারণী 16 - ফ্রিস্ট্যান্ডিং বাস্তবায়নের জন্য সি ++ শিরোনাম

Subclause                           Header(s)
                                    <ciso646>
18.2  Types                         <cstddef>
18.3  Implementation properties     <cfloat> <limits> <climits>
18.4  Integer types                 <cstdint>
18.5  Start and termination         <cstdlib>
18.6  Dynamic memory management     <new>
18.7  Type identification           <typeinfo>
18.8  Exception handling            <exception>
18.9  Initializer lists             <initializer_list>
18.10 Other runtime support         <cstdalign> <cstdarg> <cstdbool>
20.9  Type traits                   <type_traits>
29    Atomics                       <atomic>

int main()সি ব্যবহারের কী হবে ?

সি 11 স্ট্যান্ডার্ডের §5.1.2.2.2.1 স্ট্যান্ডার্ডটি পছন্দসই স্বরলিপিটি দেখায় -  int main(void)- তবে মানকটিতে দুটি উদাহরণ রয়েছে যা দেখায় int main(): §6.5.3.4 ¶8 এবং .76.7.6.3 ¶20 । এখন, এটি লক্ষ করা গুরুত্বপূর্ণ যে উদাহরণগুলি 'আদর্শিক' নয়; এগুলি কেবল বর্ণনামূলক। উদাহরণগুলিতে বাগ থাকলে, তারা সরাসরি স্ট্যান্ডার্ডের মূল পাঠ্যকে প্রভাবিত করে না। এটি বলেছিল, তারা প্রত্যাশিত আচরণের দৃ strongly়ভাবে সূচক, সুতরাং যদি মানটি int main()উদাহরণের মধ্যে অন্তর্ভুক্ত করে তবে এটি প্রস্তাব দেয় যে int main()এটি নিষিদ্ধ নয়, এমনকি যদি এটি পছন্দসই স্বরলিপি নাও হয়।

6.5.3.4 sizeof_Alignofঅপারেটরগুলি

...

¶8 উদাহরণ 3 এই উদাহরণে, একটি চলক দৈর্ঘ্যের অ্যারের আকার গণনা করা হয় এবং একটি ফাংশন থেকে ফিরে আসে:

#include <stddef.h>

size_t fsize3(int n)
{
    char b[n+3]; // variable length array
    return sizeof b; // execution time sizeof
}
int main()
{
    size_t size;
    size = fsize3(10); // fsize3 returns 13
    return 0;
}

@ ডেভিডবোলিং: এর মতো একটি ফাংশন সংজ্ঞা int main(){ … }নির্দিষ্ট করে যে ফাংশনটি কোনও আর্গুমেন্ট নেয় না, তবে একটি ফাংশন প্রোটোটাইপ সরবরাহ করে না, এএএএফসিটি। জন্য main()যে কদাপি একটি সমস্যা; এর অর্থ হ'ল যদি আপনার কাছে পুনরাবৃত্ত কলগুলি থাকে main()তবে আর্গুমেন্টগুলি চেক করা হবে না। অন্যান্য ফাংশনগুলির জন্য, এটি আরও বেশি সমস্যা - যুক্তিগুলি সঠিক কিনা তা নিশ্চিত করার জন্য যখন ফাংশনটি বলা হয় তখন আপনার সত্যিকারের স্কোপের একটি প্রোটোটাইপ দরকার।
জোনাথন লেফলার

1
@ ডেভিডবোলিং: আপনি সাধারণত main()আইওসিসি-র মতো জায়গার বাইরে পুনরাবৃত্তভাবে কল করেন না । আমার কাছে একটি পরীক্ষা প্রোগ্রাম রয়েছে যা এটি করে - মূলত অভিনবত্বের জন্য। যদি আপনার সাথে থাকে int i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }এবং জিসিসির সাথে সংকলন করে এবং -Wstrict-prototypesএটি অন্তর্ভুক্ত না করে তবে এটি কঠোর সতর্কতার অধীনে পরিষ্কারভাবে সংকলন করে। যদি এটি হয় তবে এটি main(void)সংকলন করতে ব্যর্থ।
জোনাথন লেফলার

61

আমি বিশ্বাস করি যে main()ফিরে আসা উচিত EXIT_SUCCESSবা হয় EXIT_FAILURE। তারা সংজ্ঞায়িত করা হয়stdlib.h


20
0 এছাড়াও মান।
ক্রিস ইয়ং

2
@ ক্রিস ইউং রয়েছে EXIT_SUCCESSএবং EXIT_FAILUREকারণ কিছু historic তিহাসিক অপারেটিং সিস্টেম (ভিএমএস?) সাফল্য বোঝাতে 0 টির চেয়ে আলাদা একটি সংখ্যা ব্যবহার করেছে। আজকাল এটি সর্বত্র 0
ফুজ

5
@FUZxxl আপনি সঠিক, কিন্তু আমার মন্তব্যের সাথে এটি বিরোধী নয়। EXIT_SUCCESS প্রকৃতপক্ষে ননজারো হতে পারে, তবে মানগুলি (সি 89, সি 99, সি 11) সমস্ত স্থিতি সফল সমাপ্তির একটি বাস্তবায়ন-সংজ্ঞায়িত ফর্ম হতে 0 (পাশাপাশি EXIT_SUCCESS) নির্ধারণ করে।
ক্রিস ইয়ং

2
@ ফুজজেক্সএল: এটি সত্য যে ভিএমএস বিজয় নির্দেশ করার জন্য বিজোড় মানগুলি (যেমন 1) এবং ব্যর্থতা নির্দেশ করতে মানগুলি (0 এর মতো )ও ব্যবহার করে। দুর্ভাগ্যক্রমে, মূল এএনএসআই সি স্ট্যান্ডার্ডটি ব্যাখ্যা করা হয়েছিল যে EXIT_SUCCESS 0 হওয়া উচিত, সুতরাং EXIT_SUCCESS কে মূল থেকে ফিরে আসা ভিএমএসের ঠিক ভুল আচরণ পেয়ে গেল। ভিএমএসের জন্য বহনযোগ্য জিনিসটি ব্যবহার করা ছিল exit(EXIT_SUCCESS), যা সর্বদা সঠিক কাজ করে।
অ্যাড্রিয়ান ম্যাকার্থি

1
5.1.2.2.3 "যদি মূল ফাংশনের রিটার্ন টাইপ প্রকারের সাথে সামঞ্জস্যপূর্ণ টাইপ হয় তবে প্রাথমিক কল থেকে মূল ফাংশনে প্রত্যাবর্তনটি মূল ফাংশন দ্বারা প্রদত্ত মানটিকে তার আর্গুমেন্ট হিসাবে প্রত্যাবর্তন ফাংশন বলার সমতুল্য; 11) মূল ফাংশনটি শেষ করে এমন} এ পৌঁছালে 0 এর মান ফিরে আসে "
লন্ডিন

38

নোট করুন যে সি এবং সি ++ মান দুটি ধরণের বাস্তবায়ন সংজ্ঞায়িত করে: ফ্রিস্ট্যান্ডিং এবং হোস্ট করা।

  • C90 পরিবেশিত পরিবেশ

    অনুমোদিত ফর্ম 1 :

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */

    মন্তব্যসমূহ:

    প্রাক্তন দুটি স্পষ্টভাবে অনুমোদিত ফর্ম হিসাবে বর্ণিত হয়েছে, অন্যগুলি সুস্পষ্টভাবে অনুমোদিত কারণ সি 90 রিটার্ন টাইপ এবং ফাংশন প্যারামিটারের জন্য "অন্তর্নিহিত ইন্ট" অনুমতি দেয়। অন্য কোনও ফর্মের অনুমতি নেই।

  • সি 90 ফ্রিস্ট্যান্ডিং পরিবেশ

    প্রধান কোনও ফর্ম বা নাম অনুমোদিত 2

  • C99 আয়োজিত পরিবেশ

    অনুমোদিত ফর্ম 3 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */

    মন্তব্যসমূহ:

    C99 সরানো "অন্তর্নিহিত ইনট" তাই main()আর বৈধ নয়।

    একটি অদ্ভুত, অস্পষ্ট বাক্য "বা অন্য কোনও প্রয়োগ-সংজ্ঞায়িত পদ্ধতিতে" চালু করা হয়েছে। এটি হয় "প্যারামিটারগুলি int main()পরিবর্তিত হতে পারে" বা "প্রধান হিসাবে কোনও প্রয়োগ-সংজ্ঞায়িত ফর্ম থাকতে পারে" হিসাবে ব্যাখ্যা করা যেতে পারে।

    কিছু সংকলক পরবর্তীকালে স্ট্যান্ডার্ডটি ব্যাখ্যা করতে পছন্দ করেছেন। যুক্তিযুক্তভাবে, কেউ সহজেই বলতে পারেন না যে তারা নিজেরাই মানকে উদ্ধৃত করে কঠোরভাবে মেনে চলছেন না, কারণ এটি অস্পষ্ট।

    তবে, সম্পূর্ণরূপে বন্য রূপগুলির অনুমতি main()দেওয়া সম্ভবত (?) এই নতুন বাক্যটির উদ্দেশ্য ছিল না। C99 যুক্তি (আদর্শ নয়) বোঝায় যে বাক্যটি অতিরিক্ত পরামিতিগুলিকে int main 4 এ বোঝায় ।

    তবুও হোস্ট এনভায়রনমেন্ট এনভায়রনমেন্ট প্রোগ্রাম সমাপ্তির জন্য বিভাগটি তারপরে মামলাটি নিয়ে বিতর্ক চালিয়ে যায় যেখানে প্রধান 5 টি ফিরে আসে না । যদিও বিভাগটি মূল কীভাবে ঘোষণা করা উচিত তার জন্য আদর্শিক নয়, এটি অবশ্যই বোঝায় যে হোস্ট করা সিস্টেমগুলিতেও সম্পূর্ণরূপে বাস্তবায়ন-সংজ্ঞায়িত উপায়ে প্রধান ঘোষণা করা যেতে পারে।

  • সি 99 ফ্রিস্ট্যান্ডিং পরিবেশ

    কোন ফর্ম বা প্রধান নামে অনুমোদিত হয় 6

  • সি 11 পরিবেশ পরিবেশিত

    অনুমোদিত ফর্ম 7 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
  • সি 11 ফ্রিস্ট্যান্ডিং পরিবেশ

    প্রধান কোনও ফর্ম বা নাম অনুমোদিত 8


উল্লেখ্য যে int main()উপরের সংস্করণগুলির কোনওটিতে সি এর হোস্ট করা বাস্তবায়নের জন্য কোনও বৈধ ফর্ম হিসাবে তালিকাভুক্ত হয়নি। সিতে, সি ++ এর বিপরীতে ()এবং এর (void)অর্থ আলাদা। পূর্ববর্তীটি একটি অপ্রচলিত বৈশিষ্ট্য যা ভাষা থেকে সরানো যেতে পারে। C11 ভবিষ্যতের ভাষার দিকনির্দেশ দেখুন:

.1.১১..6 ফাংশন ঘোষণাকারী

খালি বন্ধনীর সাথে ফাংশন ডিক্লেটারের ব্যবহার (প্রোটোটাইপ-ফর্ম্যাট প্যারামিটার ধরণের ডিক্লেটারগুলি নয়) একটি অপ্রচলিত বৈশিষ্ট্য।


  • সি ++ 03 পরিবেশিত পরিবেশ

    অনুমোদিত ফর্ম 9 :

    int main ()
    int main (int argc, char *argv[])

    মন্তব্যসমূহ:

    প্রথম ফর্মটিতে খালি প্রথম বন্ধনী নোট করুন। সি ++ এবং সি এক্ষেত্রে আলাদা, কারণ সি ++ এর অর্থ এই যে ফাংশনটি কোনও পরামিতি নেয় না। তবে সি এর অর্থ এটি কোনও প্যারামিটার নিতে পারে।

  • সি ++ 03 ফ্রিস্ট্যান্ডিং পরিবেশ

    প্রারম্ভকালে ডাকা ফাংশনের নামটি বাস্তবায়ন-সংজ্ঞায়িত। যদি নামকরণ করা হয় main()বর্ণিত ফরম অনুসরণ করে চলতে হবে 10 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
  • সি ++ 11 হোস্ট করা পরিবেশ

    অনুমোদিত ফর্ম 11 :

    int main ()
    int main (int argc, char *argv[])

    মন্তব্যসমূহ:

    স্ট্যান্ডার্ডের পাঠ্যটি পরিবর্তন করা হয়েছে তবে এর একই অর্থ রয়েছে।

  • সি ++ 11 ফ্রিস্ট্যান্ডিং পরিবেশ

    প্রারম্ভকালে ডাকা ফাংশনের নামটি বাস্তবায়ন-সংজ্ঞায়িত। যদি নামকরণ করা হয় main()বর্ণিত ফরম অনুসরণ করে চলতে হবে 12 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])

তথ্যসূত্র

  1. এএনএসআই X3.159-1989 2.1.2.2 হোস্ট করা পরিবেশ। "প্রোগ্রাম শুরু"

    প্রোগ্রাম স্টার্টআপে ডাকা ফাংশনটির নামকরণ করা হয় মূল। বাস্তবায়ন এই ফাংশনের জন্য কোনও প্রোটোটাইপ ঘোষণা করে না। এটি কোনও রিটার্ন টাইপ ইন্ট এবং কোনও পরামিতি ছাড়াই সংজ্ঞায়িত করা হবে:

    int main(void) { /* ... */ } 

    বা দুটি প্যারামিটার সহ (এখানে আরগসি এবং আরজিভি হিসাবে উল্লেখ করা হয়, যদিও কোনও নাম ব্যবহার করা যেতে পারে, কারণ তারা যে ফাংশনটিতে তারা ঘোষিত হয়েছে তার স্থানীয় হয়):

    int main(int argc, char *argv[]) { /* ... */ }
  2. এএনএসআই X3.159-1989 2.1.2.1 ফ্রয়েস্ট্যান্ডিং পরিবেশ:

    একটি ফ্রিস্ট্যান্ডিং পরিবেশে (যে ক্ষেত্রে অপারেটিং সিস্টেমের কোনও সুবিধা ছাড়াই সি প্রোগ্রাম কার্যকর করা যেতে পারে), প্রোগ্রাম স্টার্টআপে ডাকা ফাংশনের নাম এবং প্রকারটি বাস্তবায়ন-সংজ্ঞায়িত।

  3. আইএসও 9899: 1999 5.1.2.2 হোস্ট করা পরিবেশ -> 5.1.2.2.1 প্রোগ্রামের সূচনা

    প্রোগ্রাম স্টার্টআপে ডাকা ফাংশনটির নামকরণ করা হয় মূল। বাস্তবায়ন এই ফাংশনের জন্য কোনও প্রোটোটাইপ ঘোষণা করে না। এটি কোনও রিটার্ন টাইপ ইন্ট এবং কোনও পরামিতি ছাড়াই সংজ্ঞায়িত করা হবে:

    int main(void) { /* ... */ } 

    বা দুটি প্যারামিটার সহ (এখানে আরগসি এবং আরজিভি হিসাবে উল্লেখ করা হয়, যদিও কোনও নাম ব্যবহার করা যেতে পারে, কারণ তারা যে ফাংশনটিতে তারা ঘোষিত হয়েছে তার স্থানীয় হয়):

    int main(int argc, char *argv[]) { /* ... */ }

    বা সমতুল্য; 9) বা অন্য কোনও বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে।

  4. আন্তর্জাতিক স্ট্যান্ডার্ড জন্য প্রোগ্রামিং - প্রোগ্রামিং ভাষা - সি, সংশোধন 5.10। 5.1.2.2 হোস্ট করা পরিবেশ -> 5.1.2.2.1 প্রোগ্রামের সূচনা

    আরগভ স্ট্রিংয়ের উপস্থাপনায় কিছু অযাচিত বিভিন্নতা রোধ করার জন্য মূল দ্বারা আর্গুমেন্টের আচরণ এবং প্রস্থান, প্রধান এবং অ্যাকটিসিট (raction7.20.4.2 দেখুন) এর ইন্টারঅ্যাকশনকে কোডিং করা হয়েছে এবং মূল দ্বারা ফিরে আসা মানগুলির অর্থকে বোঝানো হয়েছে।

    মূল আর্গুমেন্ট হিসাবে আরগসি এবং আরজিভির স্পেসিফিকেশন বিস্তৃত পূর্ব অনুশীলনকে স্বীকৃতি দেয়। আরজিভি [আরজিসি] সাধারণ ব্যবহারের ভিত্তিতে তালিকার শেষের জন্য অপ্রয়োজনীয় চেক সরবরাহের জন্য নাল পয়েন্টার হওয়া প্রয়োজন।

    মূল হ'ল একমাত্র ফাংশন যা শূন্য বা দুটি যুক্তি দিয়ে বহনযোগ্যভাবে ঘোষণা করা যেতে পারে। (অন্যান্য ফাংশনগুলির আর্গুমেন্টের সংখ্যা অবশ্যই অনুরোধ এবং সংজ্ঞাতে অবশ্যই মিলবে)) প্রোগ্রামটি যখন প্রোগ্রাম আর্গুমেন্টের স্ট্রিংগুলিতে অ্যাক্সেস না করে তখন এই বিশেষ ক্ষেত্রে কেবল আর্গুমেন্টগুলি মূলত ফেলে দেওয়ার বিস্তৃত অনুশীলনকে স্বীকৃতি দেয়। যদিও অনেকগুলি বাস্তবায়নে মূলত দুটিরও বেশি যুক্তি সমর্থন করে, এই জাতীয় অনুশীলন মানক দ্বারা বরকত বা নিষিদ্ধ নয়; এমন একটি প্রোগ্রাম যা তিনটি আর্গুমেন্ট সহ প্রধানকে সংজ্ঞায়িত করে তা কঠোরভাবে মেনে চলছে না (দেখুন §J.5.1।)

  5. আইএসও 9899: 1999 5.1.2.2 হোস্ট করা পরিবেশ -> 5.1.2.2.3 প্রোগ্রাম সমাপ্তি

    যদি মূল ফাংশনের রিটার্ন টাইপ প্রকারের সাথে সামঞ্জস্যপূর্ণ হয় তবে প্রারম্ভিক কল থেকে মূল ফাংশনে ফিরে আসা প্রস্থানটি ফাংশনকে মূল ফাংশন দ্বারা তার আর্গুমেন্ট হিসাবে প্রত্যাবর্তিত মান হিসাবে কল করার সমতুল্য; 11) }যেটি সমাপ্ত হয় মূল ফাংশনটি 0 এর মান দেয় the যদি ফেরতের ধরণটি ইন্টের সাথে সামঞ্জস্য না করে তবে হোস্ট পরিবেশে প্রত্যাশিত সমাপ্তির স্থিতি অনির্দিষ্ট।

  6. আইএসও 9899: 1999 5.1.2.1 ফ্রয়েস্ট্যান্ডিং পরিবেশ

    একটি ফ্রিস্ট্যান্ডিং পরিবেশে (যে ক্ষেত্রে অপারেটিং সিস্টেমের কোনও সুবিধা ছাড়াই সি প্রোগ্রাম কার্যকর করা যেতে পারে), প্রোগ্রাম স্টার্টআপে ডাকা ফাংশনের নাম এবং প্রকারটি বাস্তবায়ন-সংজ্ঞায়িত।

  7. আইএসও 9899: 2011 5.1.2.2 হোস্ট করা পরিবেশ -> 5.1.2.2.1 প্রোগ্রামের সূচনা

    এই বিভাগটি উপরে বর্ণিত সি 99 এর মতো।

  8. আইএসও 9899: 1999 5.1.2.1 ফ্রয়েস্ট্যান্ডিং পরিবেশ

    এই বিভাগটি উপরে বর্ণিত সি 99 এর মতো।

  9. আইএসও 14882: 2003 3.6.1 মূল ফাংশন

    একটি বাস্তবায়ন মূল ফাংশনটি পূর্বাভাস দেয় না। এই ফাংশনটি ওভারলোড হবে না। এটিতে টাইপ ইন্টির একটি রিটার্ন টাইপ থাকবে, তবে অন্যথায় এটির ধরন বাস্তবায়ন-সংজ্ঞায়িত। সমস্ত বাস্তবায়ন নিম্নলিখিত উভয় মূল সংজ্ঞা দিতে অনুমতি দেবে:

    int main() { /* ... */ }

    এবং

    int main(int argc, char* argv[]) { /* ... */ }
  10. আইএসও 14882: 2003 3.6.1 মূল ফাংশন

    এটি ফ্রিস্ট্যান্ডিং পরিবেশে কোনও প্রোগ্রামের কোনও মূল কার্যকারিতা সংজ্ঞায়িত করার প্রয়োজন কিনা তা বাস্তবায়ন-সংজ্ঞায়িত।

  11. আইএসও 14882: 2011 3.6.1 মূল ফাংশন

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

    - একটি ফাংশন () ফিরে আসা এবং

    - একটি ক্রিয়াকলাপ (int, পয়েন্টার থেকে পয়েন্টার টু চর) রিটার্ন ইনট

    প্রধান (8.3.5) টাইপ হিসাবে।

  12. আইএসও 14882: 2011 3.6.1 মূল ফাংশন

    এই বিভাগটি উপরে বর্ণিত সি ++ 03 এর মতো।


একটি প্রশ্ন: সি ++ স্ট্যান্ডার্ডের অর্থ কী হ'ল ফ্রিস্ট্যান্ডিং পরিবেশে স্টার্টআপ ফাংশনের স্বাক্ষরটিও বাস্তবায়নকে সংজ্ঞায়িত করা হয়? উদাহরণস্বরূপ, একটি বাস্তবায়ন স্টার্টআপ ফাংশনটিকে সংজ্ঞায়িত করতে পারে: int my_startup_function ()বা int my_startup_function (int argc, char *argv[])তবে এটির উদাহরণস্বরূপ: char my_startup_function (long argc, int *argv[])একটি স্টার্টআপ ফাংশন হিসাবেও থাকতে পারে? আমি না, ঠিক আছে? এছাড়াও, পাশাপাশি যে অস্পষ্ট না?
উত্কু

@ উটকু এটির যে কোনও স্বাক্ষর থাকতে পারে, যতক্ষণ না এটি নামকরণ করা হয় main()কারণ এটি অবশ্যই তালিকাভুক্ত স্বাক্ষরগুলির একটি ব্যবহার করতে পারে। আমি কল্পনা করব যে অতিমাত্রায় সর্বাধিক সাধারণ একটি হবে void my_startup_function (), কারণ ফ্রিস্ট্যান্ডিং সিস্টেমগুলিতে প্রোগ্রামটি থেকে ফিরে আসা কোনও অর্থে নয়।
লন্ডিন

1
আমি দেখি. তবে যদি স্টার্টআপ ফাংশনের জন্য কোনও নাম এবং কোনও স্বাক্ষর ব্যবহার করার অনুমতি দেওয়া mainহয় তবে পাশাপাশি আলাদা আলাদা স্বাক্ষর ব্যবহারের অনুমতি দিচ্ছেন না কেন ? দুঃখিত যদি এটি একটি স্মার্ট প্রশ্ন না হয় তবে আমি পিছনের যুক্তিটি বুঝতে পারি না।
উত্কু

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

1
সি 11 স্ট্যান্ডার্ড খসড়া সম্পর্কে উল্লেখযোগ্য বিষয় func()হ'ল অপ্রচলিত হিসাবে বিবেচিত হলেও খসড়াটি নিজেই int main()তার নিজস্ব উদাহরণগুলিতে ব্যবহার করে।
আন্তি হাপালা

29

সাফল্যে 0 এবং ত্রুটির জন্য শূন্য-তে ফিরে আসুন। এটি আপনার প্রোগ্রামের সাথে কী ঘটেছে তা জানার জন্য ইউনিক্স এবং ডস স্ক্রিপ্টিং দ্বারা ব্যবহৃত স্ট্যান্ডার্ড।


8

main() সি 98 এবং কেএন্ডআর সি-তে অনির্ধারিত রিটার্নের টাইপগুলি 'ইনট'-এ ডিফল্ট হয় `

return 1? return 0?
  1. আপনি যদি কোনও রিটার্ন স্টেটমেন্ট না লিখে থাকেন int main()তবে বন্ধটি {ডিফল্টরূপে 0 ফিরে আসবে।

  2. return 0বা return 1পিতামাতার প্রক্রিয়া দ্বারা গৃহীত হবে। শেলের মধ্যে এটি একটি শেল ভেরিয়েবলের মধ্যে যায় এবং আপনি যদি নিজের প্রোগ্রামটি শেল গঠন করে এবং সেই পরিবর্তনশীলটি ব্যবহার না করে থাকেন তবে আপনাকে তার ফেরতের মান সম্পর্কে চিন্তা করার দরকার নেই main()

দেখুন আমার মূল ফাংশনটি কীভাবে ফিরে এসেছে তা আমি কীভাবে পেতে পারি?

$ ./a.out
$ echo $?

আপনি দেখতে পাচ্ছেন যে এটি পরিবর্তনশীল $?যা প্রত্যাবর্তনের মানটির সর্বনিম্ন উল্লেখযোগ্য বাইট গ্রহণ করে main()

ইউনিক্স এবং ডস স্ক্রিপ্টিং-এ, return 0সাফল্যের সাথে এবং ত্রুটির জন্য শূন্যহীন সাধারণত ফিরে আসে। এটি আপনার প্রোগ্রামের সাথে কী ঘটেছে তা জানতে এবং পুরো প্রবাহকে নিয়ন্ত্রণ করতে ইউনিক্স এবং ডস স্ক্রিপ্টিং দ্বারা ব্যবহৃত স্ট্যান্ডার্ড।


4
কড়া কথা বলতে গেলে $?পরিবেশের পরিবর্তনশীল নয়; এটি একটি শেল পূর্বনির্ধারিত (বা অন্তর্নির্মিত) পরিবর্তনশীল। পার্থক্যটি চিহ্নিত করা শক্ত, তবে আপনি যদি চালনা করেন env(কোনও যুক্তি ছাড়াই), এটি পরিবেশটি মুদ্রণ করে এবং পরিবেশে $?প্রদর্শিত হবে না।
জোনাথন লেফলার

1
মূল "শেষের পতন" এলে স্বয়ংক্রিয়ভাবে 0 ফেরৎ কেবল সি ++ এবং সি 99-এ থাকে, সি 90-এ নয়।
কাজ

টাইপো: "সমাপ্তি { " হওয়া উচিত }। এসও আমাকে এটিকে ছোট করে কোনও সম্পাদনা করার অনুমতি দেবে না।
স্পেন্সার

7

মনে রাখবেন যে, আপনি কোনও ইনট ফিরিয়ে দিলেও কিছু ওএস (উইন্ডোজ) একক বাইট (0-255) এ ফিরে আসা মানটি কেটে দেয়।


4
সম্ভবত অন্যান্য অপারেটিং সিস্টেমগুলির মতোই ইউনিক্সও একই কাজ করে। আমি জানি ভিএমএস এর সাথে এমন অবিশ্বাস্য অদ্ভুত কাজ করে যে EXIT_SUCCESS বা EXIT_FAILURE ব্যতীত অন্য কিছু ফিরিয়ে দিতে সমস্যা জিজ্ঞাসা করছে।
লিওন টিমারম্যানস

2
এমএসডিএন পৃথক হতে অনুরোধ করে: যখন এমস্কোরলিবের মাধ্যমে রিপোর্ট করা হয়, তখন একটি প্রস্থান কোড হ'ল স্বাক্ষরিত 32-বিট পূর্ণসংখ্যা । এটি বোঝাচ্ছে যে সি রানটাইম লাইব্রেরিগুলি যেগুলি প্রস্থান কোডগুলি কেটে ফেলেছে ত্রুটিযুক্ত।

হ্যাঁ, এটি ভুল। উইন্ডোজে একটি 32-বিট পূর্ণসংখ্যা ফিরে আসে (এবং রূপান্তরিত হয় unsigned)। এটি ইউনিক্স সিস্টেমে 32-বিট পূর্ণসংখ্যার সমান। তবে উভয় সিস্টেমে ইউনিক্স-স্টাইলের শেলগুলি সাধারণত একটি স্বাক্ষরযুক্ত 8-বিট পূর্ণসংখ্যা বজায় রাখে।
জন ম্যাকফারলেন

4

প্রোগ্রামটি কীভাবে বন্ধ ছিল তা যাচাই করতে রিটার্ন মান অপারেটিং সিস্টেম ব্যবহার করতে পারে।

রিটার্ন মান 0 এর অর্থ সাধারণত বেশিরভাগ অপারেটিং সিস্টেমে ঠিক আছে (আমি যেভাবেই ভাবতে পারি)।

আপনি নিজে কোনও প্রক্রিয়া কল করার সময় এটিও পরীক্ষা করা যেতে পারে এবং দেখুন যে প্রোগ্রামটি বেরিয়ে এসেছে এবং সঠিকভাবে শেষ হয়েছে কিনা।

এটা না শুধু একটি প্রোগ্রামিং কনভেনশন।


অপারেটিভ সিস্টেম উপস্থিত রয়েছে এমন ইঙ্গিত করে প্রশ্নটিতে কিছুই নেই। কোনও মূল্য ফেরানো কোনও ফ্রিস্ট্যান্ডিং সিস্টেমে কোনও অর্থবোধ করে না।
লন্ডিন

3

main()প্রোগ্রামটি কীভাবে উপস্থিত হয়েছিল তার রিটার্ন মান দেখায়। যদি প্রত্যাবর্তনের মানটি হয় এর zeroঅর্থ এটি কার্যকর করা হয়েছে যে কোনও অ-শূন্য মান এই কার্যকর করে যে কিছু কার্যকর হয়েছে represent


1
এটি একটি মন্তব্য প্রশ্নের উত্তর নয়।
লন্ডিন

2

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

তবে আমি সাধারণত 0 ফিরে আসি।


সি 99 (এবং সি ++ 98) আপনাকে প্রধান থেকে রিটার্নের বিবৃতি বাদ দিতে দেয়; C89 আপনাকে রিটার্নের বিবৃতি বাদ দিতে দেয় না।
জোনাথন লেফলার

এটি একটি মন্তব্য নয় একটি উত্তর।
লন্ডিন

এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন।
স্টিভ লিলিস

6
@ স্টিভিলিস: ২০০৮ সালে তার কোনও মন্তব্য বিভাগ ছিল না।
গ্রাহাম.রিডস

2

0 এ ফিরে প্রোগ্রামারকে বলা উচিত যে প্রোগ্রামটি সফলভাবে কাজ শেষ করেছে।


main()সাধারণত 1 টি থেকে প্রত্যাবর্তনের ফলে একটি ত্রুটি ঘটে; সাফল্যের 0 সংকেত প্রত্যাবর্তন। যদি আপনার প্রোগ্রামগুলি সর্বদা ব্যর্থ হয় তবে 1 টি ঠিক আছে তবে এটি সেরা ধারণা নয়।
জোনাথন লেফলার

1
@JonathanLeffler: ফিরে অর্থ 1থেকে mainবাস্তবায়ন-সংজ্ঞায়িত করা হয়। একমাত্র ভাষা-সংজ্ঞায়িত মানগুলি 0, EXIT_SUCCESS(প্রায়শই সংজ্ঞায়িত 0) এবং EXIT_FAILURE। ওপেনভিএমএসে, সফল সমাপ্তি return 1;নির্দেশ করে ।
কিথ থম্পসন

ভিএমএস 'সাধারণ' নয় - আমি যা বলেছিলাম তার অর্থের মধ্যে। এটি এমন কোনও বিষয় নয় যে 'কোনও বিজোড় মূল্য হ'ল সাফল্য; এমনকি মানগুলিও ভিএমএসে ব্যর্থতা?
জোনাথন লেফলার

2

বর্জন করা return 0

যখন কোনও সি বা সি ++ প্রোগ্রাম সংকলকটির শেষে পৌঁছে যায় তখন mainস্বয়ংক্রিয়ভাবে 0 ফেরত দেওয়ার কোড তৈরি করে, সুতরাং return 0;শেষে স্পষ্টতই লেখার দরকার নেই main

দ্রষ্টব্য: আমি যখন এই পরামর্শটি দেই তখন প্রায় দু'টি ধরণের মন্তব্যের মধ্যে এটি প্রায় অদৃশ্য হয়ে যায়: "আমি এটি জানতাম না।" বা "এটি খারাপ পরামর্শ!" আমার যুক্তিটি হ'ল মানক দ্বারা স্পষ্টভাবে সমর্থিত সংকলক আচরণের উপর নির্ভর করা এটি নিরাপদ এবং দরকারী। সি এর জন্য, সি 99 সাল থেকে; আইএসও / আইইসি 9899: 1999 বিভাগ 5.1.2.2.3 দেখুন:

[...] ফাংশনটিতে প্রাথমিক কল থেকে ফিরে আসা ফাংশনটিকে তার আর্গুমেন্ট হিসাবে ফিরিয়ে দেওয়া মূল্যের সাথে mainকল করার সমতুল্য ; এতে পৌঁছে ফাংশনটি সমাপ্ত হয় 0 এর মান প্রদান করে।exitmain}main

সি ++ এর জন্য, 1998 সালে প্রথম মান থেকে; আইএসও / আইইসি 14882: 1998 বিভাগ 3.6.1 দেখুন:

নিয়ন্ত্রণ যদি কোনও রিটার্নের বিবৃতি না পেয়েই মূলের শেষ প্রান্তে পৌঁছায়, তবে এর ফলাফলটি 0 প্রদানের কার্যকর হয়;

তখন থেকে উভয় মানের সমস্ত সংস্করণ (সি 99 এবং সি ++ 98) একই ধারণা বজায় রেখেছে। আমরা সি ++ এ স্বয়ংক্রিয়ভাবে উত্পন্ন সদস্য ফাংশনগুলির উপর নির্ভর করি এবং খুব কম লোক return;কোনও voidফাংশন শেষে সুস্পষ্ট বক্তব্য লিখেন । বাদ দেওয়ার কারণগুলি "এটিকে অদ্ভুত দেখাচ্ছে" এ ফোটে বলে মনে হচ্ছে । যদি, আমার মতো আপনিও সি স্ট্যান্ডার্ডে পরিবর্তনের যুক্তি সম্পর্কে আগ্রহী হন তবে এই প্রশ্নটি পড়ুন । আরও মনে রাখবেন যে নব্বইয়ের দশকের গোড়ার দিকে এটি "স্লোপি প্র্যাকটিস" হিসাবে বিবেচিত হত কারণ এটি তখনকার সংজ্ঞায়িত আচরণ (যদিও ব্যাপকভাবে সমর্থিত) ছিল।

অতিরিক্তভাবে, সি ++ কোর নির্দেশিকাগুলিরreturn 0; শেষে বাদ দেওয়ার একাধিক উদাহরণ রয়েছে mainএবং এমন কোনও নজির নেই যেখানে সুস্পষ্ট ফেরত লেখা হয় written যদিও এই নথিতে এই নির্দিষ্ট বিষয়ে এখনও পর্যন্ত কোনও সুনির্দিষ্ট গাইডলাইন নেই, তবে এটি অনুশীলনের কমপক্ষে একটি স্বীকৃত সমর্থন বলে মনে হয়।

সুতরাং আমি এটিকে বাদ দেওয়ার পক্ষে পরামর্শ দিই; অন্যরা দ্বিমত পোষণ করেন (প্রায়শই তীব্রভাবে!) যে কোনও ক্ষেত্রে, যদি আপনি যদি এটিকে বাদ দেন এমন কোডের মুখোমুখি হন তবে আপনি জানবেন যে এটি স্পষ্টভাবে স্ট্যান্ডার্ড দ্বারা সমর্থিত এবং আপনি এর অর্থ কী তা বুঝতে পারবেন।


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

4
@ জেওল: ২৮ বছর বয়সের মধ্যে শেষের সংকলকটি ব্যবহার করা ছাড়া যার যার বিকল্প নেই, সম্ভবত স্পষ্টভাবে অন্তর্ভুক্ত করা উচিত কিনা তা সিদ্ধান্ত নেওয়ার চেয়ে আরও বেশি সমস্যা রয়েছে return 0;, তবে আমি নোট করব যে সেই যুগের অনেক সংকলক return 0;এটির আগেও একটি অন্তর্নিহিত প্রয়োগ করেছিল আদর্শায়িত।
এডওয়ার্ড

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

2
আমি সি এর প্রায় বিতর্কিত হওয়ার বিষয়টি প্রশংসা করতে পারি (প্রায় @ জেডওয়োল)। সি ++ তে এটিকে ঘিরে যে কোনও বিতর্ক খাঁটি বাজে কথা।
অরবিট

2
@ এডওয়ার্ড আমি বিতর্কটির অস্তিত্ব নেই বলেছি না, আমি বলেছিলাম এটি বাজে কথা: পি
অরবিটে

1

কী ফিরিয়ে দিতে হবে তা নির্বাহের সাথে আপনি কী করতে চান তার উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি যদি কমান্ড লাইন শেল দিয়ে আপনার প্রোগ্রামটি ব্যবহার করছেন, তবে আপনাকে সাফল্যের জন্য 0 এবং ব্যর্থতার জন্য একটি শূন্য নয়। তারপরে আপনি আপনার কোডের ফলাফলের উপর নির্ভর করে শর্তসাপেক্ষ প্রসেসিং সহ শেলগুলিতে প্রোগ্রামটি ব্যবহার করতে সক্ষম হবেন। এছাড়াও আপনি আপনার ব্যাখ্যা অনুসারে যে কোনও ননজারো মান নির্ধারণ করতে পারেন, উদাহরণস্বরূপ সমালোচনামূলক ত্রুটির জন্য বিভিন্ন প্রোগ্রামের প্রস্থান পয়েন্টগুলি বিভিন্ন প্রস্থান মান সহ একটি প্রোগ্রামকে শেষ করতে পারে এবং যা কলিং শেলের কাছে পাওয়া যায় যা প্রত্যাবর্তিত মানটি পরীক্ষা করে কী সিদ্ধান্ত নিতে পারে can কোডটি শেলগুলির সাথে ব্যবহারের উদ্দেশ্যে না হলে এবং প্রত্যাবর্তিত মানটি যদি কাউকে বিরক্ত না করে তবে এটি বাদ দেওয়া যেতে পারে। আমি ব্যক্তিগতভাবে স্বাক্ষর ব্যবহার করিint main (void) { .. return 0; .. }


প্রধান () এর ফর্ম্যাটটি বাস্তবায়নের মাধ্যমে নির্ধারিত হয়, যার অর্থ সংকলক। প্রোগ্রামার কোন ফর্মটি বেছে নেবে তা চয়ন করে না, কেবলমাত্র যখন কোনও সংকলক বিভিন্ন ফর্ম সমর্থন করে।
লন্ডিন

@ লন্ডিন রিটার্ন টাইপ বাস্তবায়ন দ্বারা বাস্তবায়ন করা হবে। কিন্তু যে মানটি ফিরিয়ে আনতে হবে তা প্রোগ্রামার দ্বারা সিদ্ধান্ত নেওয়া হয়। C99 বিভাগ 5.1.2.2.3 উল্লেখ করেছে যে রিটার্নের ধরণটি mainসামঞ্জস্যপূর্ণ int। সুতরাং ফিরতে intসমস্যা হবে না। যদিও অন্যান্য রিটার্নের ধরণের অনুমতি রয়েছে তবে সেই ক্ষেত্রে রিটার্ন মান সহ পরিবেশের পরিবর্তনশীলটি অনির্দিষ্ট করা হবে। তবে যদি কোনও প্রোগ্রামার করেreturn 0; ব্যাশে তবে এটি শাখা তৈরি করতে ব্যবহার করা যেতে পারে।
ফক্সিস

1

যদি আপনার সত্যিই কোনও প্রক্রিয়া থেকে কোনও পূর্ণসংখ্যা ফেরতের দক্ষতা সম্পর্কিত সমস্যা থাকে তবে আপনার সম্ভবত সেই প্রক্রিয়াটিকে এতবার কল করা এড়ানো উচিত যে এই রিটার্ন মানটি একটি ইস্যুতে পরিণত হয়।

যদি আপনি এটি করছেন (কোনও প্রক্রিয়াটিকে বহুবার কল করুন), আপনার কলিককে সরাসরি কলারের ভিতরে রাখার বা কোনও ডিএলএল ফাইলে প্রতিটি কলের জন্য একটি নির্দিষ্ট প্রক্রিয়া বরাদ্দ না করে একটি উপায় খুঁজে পাওয়া উচিত; একাধিক প্রক্রিয়া বরাদ্দ আপনাকে এই ক্ষেত্রে প্রাসঙ্গিক দক্ষতা এনেছে।

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


1

এখানে রিটার্ন কোড ব্যবহারের একটি ছোট্ট প্রদর্শন রয়েছে ...

লিনাক্স টার্মিনাল সরবরাহ করে এমন বিভিন্ন সরঞ্জাম ব্যবহার করার সময় প্রক্রিয়াটি সমাপ্ত হওয়ার পরে ত্রুটি পরিচালনা করার জন্য রিটার্ন কোড ব্যবহার করতে পারে। কল্পনা করুন যে নিম্নলিখিত টেক্সট ফাইল মাইফাইল উপস্থিত রয়েছে:

গ্রেপ কীভাবে কাজ করে তা পরীক্ষা করার জন্য এটি কয়েকটি উদাহরণ।

আপনি যখন গ্রেপ কমান্ডটি কার্যকর করেন তখন একটি প্রক্রিয়া তৈরি হয়। এটি একবার হয়ে গেলে (এবং ভাঙেনি) এটি 0 এবং 255 এর মধ্যে কিছু কোড দেয় example উদাহরণস্বরূপ:

$ grep order myfile

যদি তুমি করো

$ echo $?
$ 0

আপনি একটি 0 পাবেন। কেন? কারণ গ্রেপ একটি মিল খুঁজে পেয়েছে এবং একটি প্রস্থান কোড 0 ফেরত দিয়েছে যা সাফল্যের সাথে প্রস্থান করার জন্য স্বাভাবিক মূল্য। আসুন এটি আবার পরীক্ষা করে দেখুন তবে এমন কিছু যা আমাদের পাঠ্য ফাইলের মধ্যে নেই এবং এর সাথে কোনও মিল খুঁজে পাওয়া যাবে না:

$ grep foo myfile
$ echo $?
$ 1

যেহেতু গ্রাইপ আমাদের ফটোগুলির সামগ্রীর সাথে টোকেন "ফু" সাথে মেলে ব্যর্থ হয়েছে রিটার্ন কোডটি 1 (ব্যর্থতা দেখা দিলে এটি সাধারণত ক্ষেত্রে হয় তবে উপরে বর্ণিত হিসাবে আপনার কাছে পছন্দ করার মতো প্রচুর মান রয়েছে)।

এখন নিম্নলিখিত বাশ স্ক্রিপ্ট (কেবল এটি একটি লিনাক্স টার্মিনালে টাইপ করুন) যদিও খুব বেসিকটিতে ত্রুটি পরিচালনার বিষয়ে কিছু ধারণা দেওয়া উচিত:

$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found

দ্বিতীয় লাইনের পরে টার্মিনালে কিছুই মুদ্রিত না হওয়ার পরে "foo" গ্রেপ রিটার্ন 1 তৈরি করেছে এবং আমরা পরীক্ষা করে দেখি যে গ্রেপের রিটার্ন কোডটি 0 এর সমান ছিল কিনা তা দ্বিতীয় শর্তসাপেক্ষ বিবৃতিটি শেষ লাইনে তার বার্তা প্রতিধ্বনিত করে যেহেতু এটি চেকের কারণে সত্য == 1।

আপনি দেখতে পাচ্ছেন যে আপনি এটি কল করছেন কিনা এবং সেই প্রক্রিয়াটি কখনও কখনও এটি কী ফিরে এসেছে তা দেখার জন্য প্রয়োজনীয় (মূল () এর ফেরতের মান দ্বারা)।


শেল স্ক্রিপ্টে, আপনি ব্যবহার করতে পারবেন if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi- প্রত্যক্ষ অবস্থা সরাসরি পরীক্ষা করে testing আপনি যদি স্ট্যাটাসটি ক্যাপচার করতে চান (রিপোর্টিং ইত্যাদির জন্য), তবে আপনি একটি অ্যাসাইনমেন্ট ব্যবহার করবেন। আপনি ব্যবহার করতে পারেন if grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fiবা আপনি তিনটি লাইন ব্যবহার করতে পারেন। এছাড়াও আপনি বিকল্প ব্যবহার পারে -sএবং -qকরতে grepউপস্থিত হওয়া থেকে ম্যাচ বা রুটিন ত্রুটি বার্তা প্রতিরোধ। যাইহোক, এটি শেল মিনটিয়া - মূল পয়েন্ট, যে প্রস্থান স্থিতিটি কার্যকর হতে পারে - ঠিক আছে।
জোনাথন লেফলার

1

সি এবং সি ++ - ইন মেইন () বা অকার্যকর প্রধান () - এ মূল () ফাংশনটি সংজ্ঞায়নের সঠিক (সবচেয়ে দক্ষ) উপায় কী এবং কেন?

"(সবচেয়ে দক্ষ)" এই শব্দগুলি প্রশ্নটি পরিবর্তন করে না। আপনি নিরস্ত পরিবেশে না থাকলে ঘোষণা করার জন্য সর্বজনীনভাবে সঠিক একটি উপায় রয়েছে main()এবং এটি প্রত্যাবর্তন হিসাবে।

main()সি এবং সি ++ এ কী ফিরতে হবে?

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

যদি মেইন মেইন () থাকে তবে 1 ফিরবেন বা 0 ফিরে আসবেন?

সাফল্যের জন্য 0, ব্যর্থতার জন্য ননজারো। আবার, আপনাকে যা বাছাই করতে হবে (বা পেতে হবে) এমন কিছু নয়: এটি ইন্টারফেস দ্বারা সংজ্ঞায়িত করা হয়েছে যা আপনি মেনে চলছেন।

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