প্রধানের সঠিক ঘোষণা কী?


147

mainসি ++ এ ফাংশনটির সঠিক স্বাক্ষর কী ? সঠিক ফেরতের প্রকারটি কী এবং এর থেকে মূল্য ফেরত দেওয়ার অর্থ কী main? অনুমোদিত প্যারামিটারের ধরনগুলি কী কী এবং এর অর্থ কী?

এই সিস্টেম নির্দিষ্ট? এই নিয়মগুলি কি সময়ের সাথে সাথে পরিবর্তিত হয়েছে? আমি যদি তাদের লঙ্ঘন করি তবে কী হবে?


1
এটি খুবই ঘনিষ্ঠভাবে সম্পর্কিত হয়, বা, সদৃশ কি উচিত mainসি এবং সি আসতে ++,
জোনাথন লেফলার

@ জোনাথনলফলার কোন মজা নেই ... এটি প্রায় 8 মাস পূর্বে 6 সংশোধনীর নকলের তালিকায় যুক্ত হয়েছিল ।
ফ্রেডওভারফ্লো

উত্তর:


192

mainফাংশন বিশ্বব্যাপী নামস্থান একটি অ সদস্য ফাংশন হিসেবে ঘোষণা করতে হবে। এর অর্থ হ'ল এটি কোনও শ্রেণীর স্থিতিশীল বা অ-স্থিতিশীল সদস্য ফাংশন হতে পারে না, বা এটি কোনও নেমস্পেসে (এমনকি নামবিহীন নেমস্পেস )ও স্থাপন করা যাবে না।

নামটি mainবিশ্বব্যাপী নেমস্পেসের একটি কার্যকারিতা ব্যতীত সি ++ তে সংরক্ষিত নয়। mainগ্লোবাল নেমস্পেসে নয় এমন অন্যান্য জিনিস, শ্রেণি, ভেরিয়েবল, গণনা, সদস্য ফাংশন এবং সদস্যবিহীন ফাংশন সহ আপনি নামধারী অন্যান্য সত্তা ঘোষণা করতে পারেন ।

আপনি mainসদস্য ফাংশন হিসাবে বা কোনও নামস্থানে একটি ফাংশন ঘোষণা করতে পারেন , তবে এই জাতীয় mainক্রিয়াকলাপটি প্রোগ্রামটি যেখানে শুরু হয় সেখানে নকশাকৃত ফাংশন হবে না ।

mainফাংশন হিসাবে বলা যায় না staticবা inline। এটি ওভারলোডও করা যায় না; mainগ্লোবাল নেমস্পেসে নামমাত্র একটি ফাংশন থাকতে পারে ।

mainআপনার প্রোগ্রামটিতে এই ফাংশনটি ব্যবহার করা যাবে না: আপনাকে mainআপনার কোডের কোথাও থেকে ফাংশনটি কল করার অনুমতি নেই, আপনাকে এর ঠিকানা নেওয়ার অনুমতি নেই are

রিটার্নের ধরণ mainঅবশ্যই হবেint । অন্য কোনও রিটার্নের ধরণের অনুমতি নেই (এই নিয়মটি সাহসের সাথে রয়েছে কারণ mainকোনও রিটার্নের ধরণের মাধ্যমে ঘোষিত ভুল প্রোগ্রামগুলি দেখা খুব সাধারণ বিষয় void; এটি সম্ভবত mainফাংশন সম্পর্কিত সবচেয়ে ঘন ঘন লঙ্ঘনকারী নিয়ম )।

এর দুটি ঘোষণা mainঅবশ্যই মঞ্জুর করতে হবে:

int main()               // (1)
int main(int, char*[])   // (2)

ইন (1) , সেখানে কোন প্যারামিটার আছে।

ইন (2) , সেখানে দুটি প্যারামিটার এবং তারা সাধারনত নামকরণ করা হয় argcএবং argvযথাক্রমে। argvপ্রোগ্রামে আর্গুমেন্ট উপস্থাপন করে এমন একটি স্ট্রিং সি অ্যারের পয়েন্টার। অ্যারে argcযুক্তি সংখ্যা argv

সাধারণত, argv[0]প্রোগ্রামটির নাম থাকে, তবে এটি সবসময় হয় না। argv[argc]নাল পয়েন্টার হওয়ার গ্যারান্টিযুক্ত।

নোট করুন যেহেতু একটি অ্যারের ধরণের আর্গুমেন্ট (যেমন char*[]) ছদ্মবেশে কেবলমাত্র একটি পয়েন্টার টাইপ আর্গুমেন্ট, তাই নিম্নলিখিত দুটি দুটি লেখার বৈধ উপায় (2) এবং তারা উভয়ই একই জিনিসটির অর্থ বোঝায়:

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

কিছু বাস্তবায়ন অন্যান্য ধরণের এবং পরামিতির সংখ্যার অনুমতি দিতে পারে; এটি কী সমর্থন করে তা দেখতে আপনাকে আপনার প্রয়োগের ডকুমেন্টেশন চেক করতে হবে।

main()সাফল্য নির্দেশ করতে শূন্য এবং ব্যর্থতা নির্দেশিত করতে শূন্য-শূন্য প্রত্যাশা করা হবে। আপনাকে এখানে স্পষ্টভাবে কোনও returnবিবৃতি লিখতে হবে না main(): আপনি যদি main()কোনও স্পষ্ট returnবিবৃতি না দিয়ে ফিরে যেতে দেন তবে এটি যেমন লিখেছেন তেমনই return 0;। নিম্নলিখিত দুটি main()ফাংশনের একই আচরণ রয়েছে:

int main() { }
int main() { return 0; }

এখানে দুটি ম্যাক্রো রয়েছে EXIT_SUCCESSএবং এর EXIT_FAILUREমধ্যে সংজ্ঞা দেওয়া হয়েছে যথাক্রমে সাফল্য এবং ব্যর্থতা নির্দেশ <cstdlib>করেও ফিরে আসতে main()পারে।

দ্বারা প্রত্যাবর্তিত মানটি ফাংশনে main()প্রেরণ করা হয় exit()যা প্রোগ্রামটি শেষ করে।

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


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

4
@ সিনিটেক: প্রশ্নটি তার প্রথম বাক্যে জিজ্ঞাসা করে, "সি ++ এর মূল ফাংশনের সঠিক স্বাক্ষর কী?" এবং প্রশ্নটি [সি ++] এবং [সি ++ - ফ্যাক্স] উভয়কেই ট্যাগ করা হয়েছে। জাভা বা সি # ব্যবহারকারী (বা অন্য কেউ) এখনও বিভ্রান্ত থাকলে আমি এটিকে সহায়তা করতে পারি না। সি # এর Mainস্থির সদস্যের ফাংশন হওয়া দরকার কারণ এতে ননমেম্বার ফাংশনও নেই। এমনকি সি 89 এরও mainফিরতে হবে int। আমি এর সঠিক নিয়মগুলি জানতে কেএন্ডআর সি সম্পর্কে যথেষ্ট পরিচিত নই, তবে আমি অনুমান করব যে এটিরও mainফিরে আসা দরকার intকারণ mainকোনও রিটার্নের ধরণটি কিছুটা সাধারণ ছিল না এবং কেএন্ডআর intতে কোনও টাইপ = অন্তর্ভুক্ত ছিল না।
জেমস ম্যাকনেলিস

3
@Suhail: যেহেতু সেই ভাষাটি কি প্রমিত বলেছেন রিটার্ন টাইপ হইবে int
জেমস ম্যাকনেলিস

1
@ সুহাইল: হ্যাঁ আপনার কোডটি সঠিক সি ++ হবে না এবং অনেক সংকলক আপনার কোডটি প্রত্যাখ্যান করবে।
জেমস ম্যাকনেলিস

2
@ সুহাইল: ভিজ্যুয়াল সি ++ ভাষা এক্সটেনশন হিসাবেvoid রিটার্ন টাইপের অনুমতি দেয় । যে সংকলকরা এটি অনুমোদন করে না তাদের মধ্যে জিসিসি এবং কমউ অন্তর্ভুক্ত রয়েছে।
জেমস ম্যাকনেলিস

15

স্ট্যান্ডার্ড ডক্স থেকে।, 3.6.1.2 মূল ফাংশন ,

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

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

আধুনিক আকারে argcহইবে প্রোগ্রাম পাস আর্গুমেন্টের সংখ্যা যা পরিবেশের প্রোগ্রাম run.If argc হয় অশূন্য থেকে [-argc -1] প্রাথমিক পয়েন্টার এই আর্গুমেন্ট argv হয় মাধ্যমে argv হয় [0] মধ্যে সরবরাহ করা হইবে নাল-টার্মিনেটেড মাল্টিবাইট স্ট্রিং এর অক্ষর .....

আশা করি এইটি কাজ করবে..


2
কেন রিটার্নের ধরণ হওয়া mainউচিত তার কোনও নির্দিষ্ট কারণ আছে int?
সুহেল গুপ্ত

1
@ সুহেলগুপ্ত: যাতে কলিং প্রক্রিয়াটি জেনে যায় যে এই প্রক্রিয়াটি সফল বলে বিবেচিত হবে কিনা । অনুমতি voidদিচ্ছে সেই মডেলটি। এমনকি যদি এটির অর্থ "সর্বদা সাফল্য মনে করা" হয় তবে এটি সত্যিকার অর্থেও বোঝা যায় না। কারণ প্রক্রিয়াটি আসলে ব্যর্থ হলে আপনার বলার উপায় ছিল না, তাই আপনি কী সত্যই সফল হয়েছেন ? না, ফিরে আসুন int
অরবিট

4

সর্বশেষ প্রকাশিত মান (সি ++ 14) এর সঠিক শব্দটি হ'ল:

একটি বাস্তবায়ন উভয় অনুমতি দেবে

  • একটি ফাংশন ()ফিরে intএবং

  • ফাংশন (int, পয়েন্টার থেকে পয়েন্টার char)ফেরতint

টাইপ হিসাবে main

এটি স্পষ্ট করে তোলে যে বিকল্প বানান এতক্ষণ অনুমোদিত হয় যতক্ষণ প্রকারের mainধরণটি হয় int()বা int(int, char**)। সুতরাং নিম্নলিখিতগুলিও অনুমোদিত:

  • int main(void)
  • auto main() -> int
  • int main ( )
  • signed int main()
  • typedef char **a; typedef int b, e; e main(b d, a c)

1
বিশেষ দ্রষ্টব্য। আমি এই উত্তরটি অন্য থ্রেডের মন্তব্যে পোস্ট করেছি, কেউ এই থ্রেডটিকে int main(void)সি ++ এ সঠিক নয় বলে প্রমাণ হিসাবে উদ্ধৃত করার চেষ্টা করেছেন ।
এমএম

3
@ স্টারগেটায়ারের auto main() -> intরিটার্ন টাইপ নেই type {ইন "(অটো মেইন () not ... অনুমোদিত নয়)" তে মনোযোগ দিন এবং দয়া করে কখন আপনি অর্থবহ কিছু যুক্ত করার জন্য পর্যাপ্ত পরিমাণ জানেন না তা জানতে শিখুন।

3

দুটি বৈধ মেইন int main()এবং int main(int, char*[])। অন্য যে কোনও জিনিস সংকলন করতে পারে বা নাও পারে। তাহলে mainস্পষ্টভাবে একটি মান ফেরত দেয় না, 0 পরোক্ষভাবে ফিরিয়ে দেওয়া হয়।


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

4
ভাষার স্পেসিফিকেশন বলছে যে মেইনের অবশ্যই রিটার্ন টাইপ হতে হবে। আপনার সংকলক দ্বারা অনুমোদিত অন্য যে কোনও রিটার্ন টাইপ হ'ল একটি সংকলক নির্দিষ্ট বর্ধন। মূলত অকার্যকর ব্যবহারের অর্থ আপনি সি ++ নয় তবে একই ভাষাতে প্রোগ্রামিং করছেন।
স্টোনমেটাল

2
কারণ মান একটি প্রয়োজন intএর রিটার্ন টাইপ হিসাবে mainযে এই মান প্রোগ্রামের প্রস্থান কোড হিসেবে শেল হস্তান্তর করা হয়, এবং shএকটি আশা int
uckelman

কারণ কি শৃঙ্খলা? একাধিক পথ বের হতে পারে। যদি ফিরতি টাইপ হয় voidতারা সবাই নিরব। সঙ্গে intআমরা থেকে প্রতিটি রিটার্ন জন্য নির্দিষ্ট প্রস্থান-মান নির্ধারণ করতে হবে main
Andreas Spindler

2

রিটার্ন মান এবং তাদের অর্থ সম্পর্কে বিশদ

প্রতি 3.6.1 ( [basic.start.main]):

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

return 0;

এর আচরণটি std::exitবিভাগের 18.5 ( [support.start.term]) তে বিশদভাবে বর্ণিত হয়েছে এবং স্থিতি কোডটি বর্ণনা করে:

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

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