মূল () পদ্ধতিটি সি তে কীভাবে কাজ করে?


96

আমি জানি যে মূল পদ্ধতিটি লেখার জন্য দুটি ভিন্ন স্বাক্ষর রয়েছে -

int main()
{
   //Code
}

অথবা কমান্ড লাইন আর্গুমেন্ট পরিচালনা করার জন্য, আমরা এটি হিসাবে লিখি-

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

ইন C++আমি জানি আমরা একটি পদ্ধতি জমিদার করতে পারেন, কিন্তু এ Cকিভাবে কম্পাইলার এই দুই আলাদা-আলাদা স্বাক্ষর হ্যান্ডেল নেই mainফাংশন আছে?


14
ওভারলোডিং একই প্রোগ্রামে একই নামের সাথে দুটি পদ্ধতি থাকা বোঝায় আপনার mainএকক প্রোগ্রামে কেবলমাত্র একটি পদ্ধতি থাকতে পারে C(বা, সত্যই, এই জাতীয় কোনও নির্মাণের মতো কোনও ভাষায়)।
কাইল স্ট্র্যান্ড

13
সি এর কোন পদ্ধতি নেই; এটির কার্যকারিতা রয়েছে। পদ্ধতিগুলি হ'ল অবজেক্ট-ওরিয়েন্টেড "জেনেরিক" ফাংশনগুলির ব্যাক এন্ড বাস্তবায়ন। প্রোগ্রামটি কিছু অবজেক্ট আর্গুমেন্ট সহ একটি ফাংশন কল করে এবং অবজেক্ট সিস্টেম তাদের ধরণের ভিত্তিতে একটি পদ্ধতি (বা সম্ভবত কোনও পদ্ধতির সেট) বেছে নেয়। সি এর কাছে এই জিনিসগুলির কোনওটিই থাকে না যদি না আপনি নিজেই এটি অনুকরণ করে।
কাজ

4
প্রোগ্রাম এন্ট্রি পয়েন্টগুলির উপর গভীর আলোচনার জন্য - বিশেষত নয় main- আমি জন আর। লেভাইনস ক্লাসিক বই "লিংকারস এবং লোডারস" এর প্রস্তাব দিই।
Andreas Spindler

4
সি তে, প্রথম ফর্মটি int main(void)নয়, int main()(যদিও আমি কোনও সংকলক দেখিনি যা int main()ফর্মটি প্রত্যাখ্যান করে )।
কিথ থম্পসন

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

উত্তর:


133

সি ভাষার বৈশিষ্ট্যগুলির কিছু হ্যাক হিসাবে শুরু হয়েছিল যা সবেমাত্র কাজ করার জন্য ঘটেছে।

মূলটির জন্য একাধিক স্বাক্ষর, পাশাপাশি পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট তালিকাগুলি এই বৈশিষ্ট্যগুলির মধ্যে একটি।

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

কলিং কনভেনশনগুলি যদি এমন হয় তবে এটি এমন হয়:

  1. কলিং ফাংশনটি তর্কগুলি পরিষ্কার করে।
  2. বামতম আর্গুমেন্টগুলি স্ট্যাকের শীর্ষে বা স্ট্যাক ফ্রেমের গোড়ায় খুব কাছাকাছি, যাতে উত্সাহী যুক্তিগুলি ঠিকানাটি অকার্যকর করে না।

কলিং কনভেনশনগুলির একটি সেট যা এই নিয়মগুলি মান্য করে তা হ'ল স্ট্যাক-ভিত্তিক প্যারামিটারটি হয় যার মাধ্যমে কলার আর্গুমেন্টগুলি পপ করে এবং সেগুলি ডানে বামে ঠেলা যায়:

 ;; pseudo-assembly-language
 ;; main(argc, argv, envp); call

 push envp  ;; rightmost argument
 push argv  ;; 
 push argc  ;; leftmost argument ends up on top of stack

 call main

 pop        ;; caller cleans up   
 pop
 pop

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

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

/* I'm adding envp to show that even a popular platform-specific variant
   can be handled. */
extern int main(int argc, char **argv, char **envp);

void __start(void)
{
  /* This is the real startup function for the executable.
     It performs a bunch of library initialization. */

  /* ... */

  /* And then: */
  exit(main(argc_from_somewhere, argv_from_somewhere, envp_from_somewhere));
}

অন্য কথায়, এই শুরু মডিউলটি সর্বদা তিনটি-যুক্তির প্রধানকে কল করে। যদি প্রধান কোনও আর্গুমেন্ট না নেয়, বা কেবলমাত্র int, char **, এটি কলিং কনভেনশনগুলির কারণে, ঠিকঠাক কাজ করার পাশাপাশি ঘটে যদি এটি কোনও যুক্তি না নেয়।

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

তবে ধরুন যে আহ্বানকারী সম্মেলনগুলি এমন যে এটি এইভাবে কাজ করতে পারে না। সেক্ষেত্রে সংকলকটিকে mainবিশেষভাবে চিকিত্সা করতে হবে । যখন এটি লক্ষ্য করে যে এটি mainফাংশনটি সংকলন করছে , তখন এটি কোড উত্পন্ন করতে পারে যা একটি তিনটি আর্গুমেন্ট কলের সাথে সামঞ্জস্যপূর্ণ say

বলতে গেলে, আপনি এটি লিখুন:

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

কিন্তু যখন সংকলক এটি দেখে, এটি মূলত একটি কোড ট্রান্সফর্মেশন সম্পাদন করে যাতে এটি সংকলিত ফাংশনটি আরও দেখতে এইরকম হয়:

int main(int __argc_ignore, char **__argv_ignore, char **__envp_ignore)
{
   /* ... */
}

নামগুলি বাদে __argc_ignoreআক্ষরিক অর্থেই অস্তিত্ব নেই। এ জাতীয় কোনও নাম আপনার সুযোগে প্রবর্তিত হয়নি এবং অব্যবহৃত যুক্তি সম্পর্কে কোনও সতর্কতা থাকবে না। কোড রূপান্তরকরণটি সংযোগকারীকে সঠিক লিঙ্কেজ সহ কোড নির্গমন ঘটায় যা জানে যে এটি তিনটি আর্গুমেন্ট পরিষ্কার করতে পারে।

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

সি 99 ভাষার সংকলকগণকে সর্বদা mainবিশেষভাবে কিছুটা চিকিত্সা করতে হবে, কিছুটা হলেও হ্যাককে সমর্থন করতে হবে যে যদি কোনও returnবিবৃতি ছাড়াই ফাংশনটি সমাপ্ত হয় , আচরণটি যেমন return 0মৃত্যুদন্ড কার্যকর হয়েছিল। এটি আবার কোড ট্রান্সফর্মেশন দ্বারা চিকিত্সা করা যেতে পারে। সংকলক বিজ্ঞপ্তি যে একটি ফাংশন বলা mainসংকলিত হচ্ছে। তারপরে এটি পরীক্ষা করে যে শরীরের শেষটি সম্ভাব্যভাবে পৌঁছানো যায় কিনা। যদি তা হয় তবে এটি সন্নিবেশ করায়return 0;


34

mainএমনকি সি ++ তেও কোনও ওভারলোডিং নেই । মূল ফাংশন হ'ল একটি প্রোগ্রামের প্রবেশের পয়েন্ট এবং শুধুমাত্র একটি সংজ্ঞা থাকে।

স্ট্যান্ডার্ড সি জন্য

একটি হোস্ট করা পরিবেশের জন্য (এটি সাধারণ একটি), সি 99 স্ট্যান্ডার্ডটি বলে:

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

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

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

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

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

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

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

স্ট্যান্ডার্ড সি ++ এর জন্য:

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

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

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

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

এবং

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

সি ++ স্ট্যান্ডার্ড স্পষ্টতই বলেছে "এটি [মূল ফাংশন] এর একটি প্রকারের প্রকারের টাইপ থাকতে হবে, তবে অন্যথায় এর ধরণের প্রয়োগ বাস্তবায়িত হয়", এবং সি স্ট্যান্ডার্ডের মতো একই দুটি স্বাক্ষর প্রয়োজন।

একটি হোস্ট করা পরিবেশে (এসি পরিবেশ যা সি লাইব্রেরিগুলিকে সমর্থন করে) - অপারেটিং সিস্টেম কল করে main

একটি অ-হোস্টেড পরিবেশে (এম্বেডেড অ্যাপ্লিকেশনগুলির জন্য এক) আপনি সর্বদা প্রসেসরের প্রাক নির্দেশিকা ব্যবহার করে আপনার প্রোগ্রামের প্রবেশ পয়েন্ট (বা প্রস্থান) পরিবর্তন করতে পারেন

#pragma startup [priority]
#pragma exit [priority]

যেখানে অগ্রাধিকার হ'ল optionচ্ছিক অবিচ্ছেদ্য সংখ্যা।

প্রাগমা স্টার্টআপ মূল (অগ্রাধিকার অনুসারে) এর আগে ফাংশনটি সম্পাদন করে এবং প্রাগমা প্রস্থানটি মূল ফাংশনের পরে ফাংশনটি কার্যকর করে। যদি একাধিক সূচনার নির্দেশ থাকে তবে অগ্রাধিকার সিদ্ধান্ত নেয় যেটি প্রথমে কার্যকর করবে।


4
আমি মনে করি না, এই উত্তরটি আসলে এই প্রশ্নের উত্তর দেয় যে সংকলক আসলে কীভাবে পরিস্থিতি পরিচালনা করে। @ কাজজের দেওয়া উত্তরটি আমার মতে আরও অন্তর্দৃষ্টি দেয়।
টিলম্যান ভোগেল

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

4
ফ্রিস্ট্যান্ডিং এনভায়রনমেন্টের জন্য ("অ-হোস্টেড"), কিছু # প্রগমা ব্যতীত আরও অনেক কিছু চলছে। হার্ডওয়্যার থেকে রিসেট বিঘ্ন ঘটেছে এবং এটিই প্রোগ্রামটি শুরু করে। সেখান থেকে সমস্ত মৌলিক সেটআপগুলি সম্পাদন করা হয়: সেটআপ স্ট্যাক, রেজিস্টারস, এমএমইউ, মেমরি ম্যাপিং ইত্যাদি Then স্ট্যাটিক স্টোরেজ ভেরিয়েবল যা শূন্য (.bss বিভাগ) এ সেট করা উচিত। সি ++ এ স্থিতিশীল স্টোরেজ সময়কাল সহ অবজেক্টের কনস্ট্রাক্টরদের ডাকা হয়। এবং একবার সব করা হয়ে গেলে, তারপরে মেইন বলা হয়।
লুন্ডিন

8

ওভারলোডিংয়ের দরকার নেই। হ্যাঁ, এখানে দুটি সংস্করণ রয়েছে তবে কেবলমাত্র একটি সময় ব্যবহার করা যেতে পারে।


5

এটি সি এবং সি ++ ভাষার এক বিস্ময়কর অসম্পূর্ণতা এবং বিশেষ নিয়ম।

আমার মতে এটি কেবল historicalতিহাসিক কারণে বিদ্যমান এবং এর পিছনে সত্যিকারের গুরুতর কোন যুক্তি নেই। নোট যে mainঅন্যান্য কারণেও বিশেষ (উদাহরণস্বরূপ mainC ++ এ পুনরাবৃত্তি করা যাবে না এবং আপনি এর ঠিকানা নিতে পারবেন না এবং C99 / C ++ এ আপনাকে একটি চূড়ান্ত returnবিবৃতি বাদ দিতে দেওয়া হবে )।

এটিও নোট করুন যে এমনকি সি ++ তে এটি কোনও ওভারলোড নয় ... হয় কোনও প্রোগ্রামের প্রথম ফর্ম রয়েছে বা এটির দ্বিতীয় রূপ রয়েছে; এটি উভয় থাকতে পারে।


আপনি returnসি তেও বিবৃতিটি বাদ দিতে পারেন (সি 99 সাল থেকে)।
ড্রিমলাক্স

সি তে, আপনি কল করে main()তার ঠিকানা নিতে পারেন ; সি ++ এমন সীমা প্রয়োগ করে যা সি দেয় না।
জোনাথন লেফলার

@ জোনাথনলফলার: আপনি ঠিক বলেছেন, স্থির আছেন। রিটার্নের মান বাদ দেওয়ার সম্ভাবনা ছাড়াও আমি মুখ্য সম্পর্কে একমাত্র মজাদার বিষয়টি হ'ল স্ট্যান্ডার্ডটি IIUC হিসাবে বর্ণিত হওয়ায় আপনি argcপুনরাবৃত্তি করার সময় একটি নেতিবাচক মান পাস করতে পারবেন না (5.1.2.2.1 এ সীমাবদ্ধতা নির্দিষ্ট করে না argcএবং argvকেবলমাত্র প্রাথমিক কল এ প্রয়োগ করুন main)।
6502

4

যেটি অস্বাভাবিক mainতা হ'ল এটি একাধিক উপায়ে সংজ্ঞায়িত করা যায় না, এটি কেবল দুটি ভিন্ন উপায়ে একটিতে সংজ্ঞায়িত করা যায়।

mainএকটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন; বাস্তবায়ন এটির জন্য একটি প্রোটোটাইপ ঘোষণা করে না।

একই জিনিসটি সত্য fooবা সত্য bar, তবে আপনি নিজের পছন্দ অনুযায়ী যে কোনও নাম দিয়ে ফাংশন সংজ্ঞায়িত করতে পারেন।

পার্থক্যটি হ'ল mainবাস্তবায়ন দ্বারা চালিত হয় (রানটাইম পরিবেশ) কেবল আপনার নিজের কোড দ্বারা নয়। বাস্তবায়ন কেবল সাধারণ সি ফাংশন কল শব্দার্থবিজ্ঞানের মধ্যে সীমাবদ্ধ নয়, তাই এটি কয়েকটি (এবং অবশ্যই) কয়েকটি বৈচিত্র্য মোকাবেলা করতে পারে - তবে এটি অসীম বহু সম্ভাবনাগুলি পরিচালনা করার প্রয়োজন হয় না। int main(int argc, char *argv[])ফর্ম এবং, কমান্ড লাইন আর্গুমেন্ট জন্য করতে পারবেন int main(void)সি বা int main()C ++ শুধু সহজ প্রোগ্রাম যা প্রক্রিয়া কমান্ড লাইন আর্গুমেন্ট প্রয়োজন হবে না জন্য একটি সুবিধার্থে।

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

এবং সি এবং সি ++ এর অনেক কিছুর মতো, বিশদগুলি মূলত ইতিহাসের ভাষা এবং তাদের পূর্বসূরিদের ডিজাইনারদের দ্বারা করা স্বেচ্ছাসেবী সিদ্ধান্তের ফলাফল।

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


3

mainশুধু linker যেখানে স্থির শুরুর ঠিকানার জন্য একটি নাম mainডিফল্ট নাম। কোনও প্রোগ্রামের সমস্ত ফাংশনের নাম ঠিকানাগুলি শুরু করে যেখানে ফাংশন শুরু হয়।

ফাংশন আর্গুমেন্টগুলি স্ট্যাক থেকে / ধাক্কা দিয়ে / পপ করা হয় যাতে ফাংশনটির জন্য কোনও আর্গুমেন্ট নির্দিষ্ট না করা থাকে তবে স্ট্যাকের উপরে / বন্ধ কোনও আর্গুমেন্ট চাপানো / পপড করা নেই। এটিই মূলত তর্ক বা যুক্তি ছাড়াই কাজ করতে পারে।


2

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

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

যেখানে ভেরিয়েবল আরগসি পাস করা ডেটার গণনা সংরক্ষণ করে এবং আরজিভিটি চরকে পয়েন্টারের একটি অ্যারে যা কনসোল থেকে পাস হওয়া মানগুলিকে নির্দেশ করে। অন্যথায় এটি সঙ্গে সর্বদা ভাল

    int main()
    {
       //Code
    }

তবে যে কোনও ক্ষেত্রে একটি প্রোগ্রামে একটি এবং কেবলমাত্র একটি প্রধান () থাকতে পারে, কারণ এটিই কেবলমাত্র একমাত্র পয়েন্ট যেখানে একটি প্রোগ্রাম থেকে তার প্রয়োগ শুরু হয় এবং তাই এটি একের বেশি হতে পারে না। (আশা করি এটি যোগ্য)


2

আগে অনুরূপ একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল: কোনও পরামিতিবিহীন কোনও ফাংশন (প্রকৃত ফাংশন সংজ্ঞা তুলনায়) সংকলন করে কেন?

শীর্ষস্থানীয় উত্তরগুলির মধ্যে একটি ছিল:

সি এর func()অর্থ হল যে আপনি যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারেন । আপনি যদি কোনও যুক্তি না চান তবে আপনাকে এটি হিসাবে ঘোষণা করতে হবেfunc(void)

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

int main(int only_one_argument) {
    // code
}

এবং এটি এখনও সংকলন এবং চালানো হবে।


4
দুর্দান্ত পর্যবেক্ষণ! এটি লিঙ্কারটির পক্ষে যথেষ্ট ক্ষমাশীল বলে মনে হয় main, কারণ এখানে এখনও উল্লেখ করা হয়নি এমন একটি সমস্যা রয়েছে: এর জন্য আরও তর্ক main! "ইউনিক্স (তবে পিক্সিক্স ১। নয়) এবং মাইক্রোসফ্ট উইন্ডোজ" যোগ করুন char **envp(আমি ডসকে স্মরণ করি যে এটিও অনুমোদন করেছিল, তাই না?), এবং ম্যাক ওএস এক্স এবং ডারউইন আরও একটি "স্বেচ্ছাসেবক ওএস সরবরাহিত তথ্য" চর * পয়েন্টার যুক্ত করেছে। উইকিপিডিয়া
usr2564301

0

আপনার এটিকে ওভাররাইড করার দরকার নেই b কারণ একবারে কেবলমাত্র একজন ব্যবহার করবেন yes মূল ফাংশনের 2 টি আলাদা সংস্করণ রয়েছে

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