মূল () আসলেই কি একটি সি ++ প্রোগ্রাম শুরু হয়?


131

সি ++ স্ট্যান্ডার্ডের বিভাগটি $ 3.6.1 / 1 পড়ছে,

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

এখন এই কোডটি বিবেচনা করুন,

int square(int i) { return i*i; }
int user_main()
{ 
    for ( int i = 0 ; i < 10 ; ++i )
           std::cout << square(i) << endl;
    return 0;
}
int main_ret= user_main();
int main() 
{
        return main_ret;
}

এই নমুনা কোডটি আমি যা করতে চাইছি তা করে, অর্থাৎ 0 থেকে 9 পর্যন্ত পূর্ণসংখ্যার বর্গক্ষেত্রটি মুদ্রণ করে ফাংশনে প্রবেশের আগেmain() যা প্রোগ্রামটির "শুরু" বলে মনে করা হয়।

আমি এটি -pedanticবিকল্প, জিসিসি 4.5.0 সহ সংকলন করেছি । এটি কোনও ত্রুটি দেয় না, এমনকি সতর্কতাও দেয় না!

আমার প্রশ্নটি হ'ল

এই কোডটি কি আসলে স্ট্যান্ডার্ড কনফর্মেন্ট?

এটি যদি মানসম্মত হয় তবে স্ট্যান্ডার্ড কী বলে তা অকার্যকর করে না? main()এই প্রোগ্রাম শুরু হয় না! user_main()আগে মৃত্যুদন্ড কার্যকর main()

আমি বুঝি যে বিশ্বব্যাপী পরিবর্তনশীল আরম্ভ করতে main_ret, use_main()প্রথম, executes তবে সেটা ভিন্ন জিনিস পুরাপুরি হয়; পয়েন্ট যে, এটা করে $ 3.6.1 / 1 স্ট্যান্ডার্ড থেকে উদ্ধৃত বিবৃতি বাতিল, যেমন main()নয় শুরু কর্মসূচির; এটা সত্য হয় শেষ এর এই প্রোগ্রাম!


সম্পাদনা করুন:

আপনি কীভাবে 'শুরু' শব্দের সংজ্ঞা দেন?

এটি "প্রোগ্রামের শুরু" বাক্যটির সংজ্ঞায় ফোটে । সুতরাং আপনি কিভাবে এটি সংজ্ঞায়িত করবেন?

উত্তর:


85

না, সি -+ মূল আহ্বানের আগে "পরিবেশ নির্ধারণ" করতে অনেক কিছুই করে; তবে, সি ++ প্রোগ্রামের "ব্যবহারকারী নির্দিষ্ট" অংশটির আনুষ্ঠানিক শুরুটি প্রধান।

কিছু পরিবেশ সেটআপ নিয়ন্ত্রণযোগ্য নয় (যেমন স্টাড :: কোট সেটআপ করার প্রাথমিক কোডের মতো; তবে কিছু পরিবেশ স্ট্যাটিক গ্লোবাল ব্লকের মতো নিয়ন্ত্রণযোগ্য (স্ট্যাটিক গ্লোবাল ভেরিয়েবলগুলি আরম্ভ করার জন্য) Note মনে রাখবেন যেহেতু আপনার পূর্ণতা নেই) প্রধানের আগে নিয়ন্ত্রণ করুন, স্থিতিশীল ব্লকগুলি ক্রম শুরু করার ক্রমে আপনার সম্পূর্ণ নিয়ন্ত্রণ নেই।

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


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

13
@ নাওয়াজ: নোট করুন যে আরম্ভের আদেশের উপরে সম্পূর্ণ নিয়ন্ত্রণের উপরে নয়, আদ্যক্ষর ত্রুটির উপর আপনার কোনও নিয়ন্ত্রণ নেই: আপনি বিশ্বব্যাপী সুযোগে ব্যতিক্রমগুলি ধরতে পারবেন না।
আন্দ্রে কারন

@ নাওয়াজ: স্ট্যাটিক গ্লোবাল ব্লক কি? আপনি দয়া করে সাধারণ উদাহরণ ব্যবহার করে ব্যাখ্যা করবেন? ধন্যবাদ
ডেস্ট্রাক্টর

@ মিট: নাম স্থান পর্যায়ে ঘোষিত অবজেক্টগুলির staticস্টোরেজ সময়কাল থাকে এবং যেমন, বিভিন্ন অনুবাদ ইউনিটের অন্তর্গত এই বিষয়গুলি যে কোনও ক্রমে সূচনা করা যেতে পারে (কারণ আদেশটি মান দ্বারা অনির্দিষ্টকৃত )। আমি নিশ্চিত নই যে এটি যদি আপনার প্রশ্নের জবাব দেয় তবে আমি এই বিষয়টির প্রসঙ্গে বলতে পারি।
নওয়াজ

88

আপনি বাক্যটি ভুলভাবে পড়ছেন।

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

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

আপনার প্রোগ্রামটি অনুগত। আপনার প্রোগ্রামটি শুরু না হওয়া অবধি "শুরু" হয়নি। আপনার প্রোগ্রামটি "স্টার্ট" এর সংজ্ঞা অনুযায়ী স্ট্যান্ডার্ডটিতে "প্রোগ্রাম শুরু" হওয়ার আগেই কনস্ট্রাক্টরকে ডাকা হয় তবে এটি গুরুত্ব সহকারে গুরুত্বপূর্ণ। কোড অনেক আগে মৃত্যুদন্ড কার্যকর করা হয় mainকরা হয় কি না শুধু এই উদাহরণে যে প্রোগ্রামে বলা হয়,।

আলোচনার উদ্দেশ্যে, আপনার কনস্ট্রাক্টর কোডটি প্রোগ্রামের 'শুরু' এর আগে কার্যকর করা হয় এবং এটি পুরোপুরি মানের সাথে সম্মতিযুক্ত।


3
দুঃখিত, তবে আমি আপনার এই ধারাটির ব্যাখ্যার সাথে একমত নই।
অরবিট

আমি মনে করি অ্যাডাম ডেভিস ঠিক বলেছেন, "মূল" হ'ল কোডিং বিধিনিষেধের মতো।
লাইক

@ লাইটনেসেসিনআরবিট আমি কখনই অনুসরণ করিনি, তবে আমার কাছে এই বাক্যটি যৌক্তিকভাবে "মূল নামক একটি বিশ্বব্যাপী ফাংশন যা প্রোগ্রামের নির্ধারিত শুরু " -এ সিদ্ধ করা যেতে পারে (জোর দেওয়া হয়েছে)। আপনার এই বাক্যটির ব্যাখ্যা কী?
অ্যাডাম ডেভিস

1
@ অ্যাডামডাভিস: আমার উদ্বেগটি কী ছিল তা আমার মনে নেই। আমি এখন একজনের কথা ভাবতে পারি না।
অরবিটে হালকাতা রেস

23

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

বাস্তবে এটি বাস্তবায়নের জন্য আপনার কাছে একটি অবজেক্ট থাকতে হবে যা প্রোগ্রামের সমস্ত প্রবাহকে ডাকার জন্য প্রধান এবং এর নির্মাতার পূর্বে নির্মিত হয়েছিল।

এটা দেখ:

class Foo
{
public:
   Foo();

 // other stuff
};

Foo foo;

int main()
{
}

আপনার প্রোগ্রামের প্রবাহ কার্যকরভাবে থেকে শুরু হবে Foo::Foo()


13
+1 টি। তবে মনে রাখবেন যে আপনার যদি বিভিন্ন অনুবাদ ইউনিটে একাধিক বিশ্বব্যাপী অবজেক্ট থাকে তবে এটি আপনাকে সমস্যার মধ্যে ফেলবে যেহেতু কনস্ট্রাক্টরগুলি যে ক্রমটিকে বলা হচ্ছে তা অপরিজ্ঞাত। আপনি সিলেটলেট এবং অলস সূচনা দিয়ে পালাতে পারেন, তবে বহুবিবাহিত পরিবেশে জিনিসগুলি খুব কুৎসিত হয়। এক কথায়, রিয়েল কোডে এটি করবেন না।
আলেকজান্দ্রি সি

3
আপনার কোডটিতে প্রধান () কে আপনার সম্ভবত একটি যথাযথ দেহ দেওয়া উচিত এবং এটি সম্পাদন চালানোর অনুমতি দেওয়া উচিত, এর বাইরে যে অবজেক্টগুলির ধারণা শুরু হয় তা হ'ল অনেকগুলি LD_PRELOAD লাইব্রেরি ভিত্তিক।
নগদকাহ

2
@ অ্যালেক্স: মানটি অপরিজ্ঞাতভাবে বলেছে, তবে ব্যবহারিক বিষয় হিসাবে লিংক অর্ডার হিসাবে (সাধারণত, সংকলকের উপর নির্ভর করে) উদ্যোগ অর্ডারকে নিয়ন্ত্রিত করে।
থমাসম্যাকলিউড

1
@ থমাস: আমি অবশ্যই দূরবর্তীভাবে তার উপর নির্ভর করার চেষ্টা করব না। আমি অবশ্যই ম্যানুয়ালি বিল্ড সিস্টেমকে নিয়ন্ত্রণ করার চেষ্টা করব না।
আলেকজান্দ্রি সি

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

15

আপনি প্রশ্নটিকে "সি" হিসাবে ট্যাগ করেছেন, তারপরে, সি সম্পর্কে কঠোরভাবে কথা বললে, আপনার সূচনাটি আইএসও সি 99 স্ট্যান্ডার্ডের 6..7.৮ "প্রাথমিককরণ" অনুসারে ব্যর্থ হওয়া উচিত।

এই ক্ষেত্রে সর্বাধিক প্রাসঙ্গিক বলে মনে হচ্ছে বাধা # 4 যা বলে:

স্ট্যাটিক স্টোরেজ সময়কালের জন্য কোনও অবজেক্টের জন্য ইনিশিয়ালাইজারের সমস্ত এক্সপ্রেশন হ'ল স্থির এক্সপ্রেশন বা স্ট্রিং লিটারাল।

সুতরাং, আপনার প্রশ্নের উত্তর হ'ল কোডটি সি স্ট্যান্ডার্ডের সাথে সঙ্গতিপূর্ণ নয়।

আপনি যদি কেবল সি ++ স্ট্যান্ডার্ডের প্রতি আগ্রহী হন তবে আপনি সম্ভবত "সি" ট্যাগটি সরাতে চাইবেন।


4
@ রেমো.ডি আপনি কি আমাদের এই বিভাগে রয়েছে তা বলতে পারেন। আমাদের সবার সি স্ট্যান্ডার্ড নেই :)।
উম্মা গুম্মা

2
যেহেতু আপনি এতটাই বাছাই: হায়, এএনএসআই সি 1989 সাল থেকে অপ্রচলিত ISO আইএসও সি 90 বা সি 99 উল্লেখ করার জন্য প্রাসঙ্গিক মান standards
লন্ডিন

@ লন্ডিন: কেউ কখনও পর্যাপ্ত পরিমাণে পিক না :) আমি আইএসও সি 99 পড়ছিলাম তবে আমি দৃ confident়ভাবে আত্মবিশ্বাসী এটি সি 90 এর ক্ষেত্রেও প্রযোজ্য।
রেমো.ডি

@একটি প্রচেষ্টা. আপনি ঠিক বলেছেন, আমার মনে হয় এমন বাক্যটি এখানে যুক্ত করুন।
রেমো.ডি

3
@ রেমো: বৈধ সি নয় এমন তথ্য সরবরাহের জন্য +1; আমি এটা জানতাম না। দেখুন মানুষ এভাবেই শিখেন, কখনও পরিকল্পনার মাধ্যমে, কখনও কখনও চান্সেই!
নওয়াজ

10

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


9

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

এভাবে মূল প্রশ্ন হল কারণ একটি সি প্রোগ্রাম আপনি এখনও প্রোগ্রাম শুরু করতে পারার আগে করতে globals / স্ট্যাটিক আরম্ভের হবে পাশাপাশি সি প্রাসঙ্গিক।

মানগুলি ধরে নিয়েছে যে এই পরিবর্তনগুলি "ম্যাজিক" এর মাধ্যমে আরম্ভ করা হয়েছে, কারণ তারা প্রোগ্রামের সূচনা করার আগে কীভাবে সেট করা উচিত তা বলে না । আমি মনে করি তারা এটিকে প্রোগ্রামিং ভাষার মানদণ্ডের বাইরে কিছু হিসাবে বিবেচনা করেছিল।

সম্পাদনা করুন: উদাহরণস্বরূপ আইএসও 9899: 1999 5.1.2:

স্ট্যাটিক স্টোরেজ সময়কাল সহ সমস্ত বস্তু প্রোগ্রাম শুরু হওয়ার আগেই (তাদের প্রাথমিক মানগুলিতে সেট করা) শুরু করা হবে। এ জাতীয় সূচনা করার পদ্ধতি এবং সময় অন্যথায় অনির্দিষ্ট।

এই "যাদু" কীভাবে করা হয়েছিল তার পেছনের তত্ত্বটি সি-র জন্মের আগের দিক থেকে ফিরে আসে, যখন এটি র‌্যাম-ভিত্তিক কম্পিউটারগুলিতে কেবল ইউএনআইএক্স ওএসের জন্য ব্যবহৃত একটি প্রোগ্রামিং ভাষা ছিল। তত্ত্ব অনুসারে, প্রোগ্রামটি নিজেই র‌্যামে আপলোড হওয়ার সাথে সাথে এক্সিকিউটেবল ফাইল থেকে সমস্ত প্রারম্ভিক ডেটা লোড করতে সক্ষম হবে।

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

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

সুতরাং, মানকগুলির আরম্ভকরণের নিয়মগুলি মেনে চলার জন্য প্রতিটি সি / সি ++ প্রোগ্রামের কিছু প্রাথমিক / "কপি-ডাউন" কোড থাকে যা মূল বলা হওয়ার আগেই কার্যকর করা হয়।

উদাহরণস্বরূপ, এম্বেড থাকা সিস্টেমগুলিতে সাধারণত "নন-আইএসও কমপ্লায়েন্ট স্টার্টআপ" নামক একটি বিকল্প থাকে যেখানে কার্য সম্পাদনের কারণে পুরো সূচনা পর্বটি বাদ দেওয়া হয় এবং তারপরে কোডটি মূল থেকে সরাসরি শুরু হয়। তবে এই জাতীয় সিস্টেমগুলি মানগুলির সাথে সামঞ্জস্য করে না, কারণ আপনি গ্লোবাল / স্ট্যাটিক ভেরিয়েবলের init মানগুলিতে নির্ভর করতে পারবেন না।


4

আপনার "প্রোগ্রাম" গ্লোবাল ভেরিয়েবল থেকে কেবল একটি মান দেয়। আর সবই হচ্ছে ইনিশিয়াল কোড। সুতরাং, মানটি ধারণ করে - আপনার কাছে খুব তুচ্ছ প্রোগ্রাম এবং আরও জটিল সূচনা রয়েছে।



2

একটি ইংরাজী শব্দার্থবিজ্ঞানের মতো মনে হচ্ছে দ্বিগুণ। ওপি তার ব্লক কোডটিকে প্রথমে "কোড" এবং পরে "প্রোগ্রাম" হিসাবে উল্লেখ করে। ব্যবহারকারী কোডটি লেখেন, এবং তারপরে সংকলক প্রোগ্রামটি লেখেন।


1

মেইনকে সমস্ত বৈশ্বিক চলক আরম্ভ করার পরে বলা হয়।

মানটি যা নির্দিষ্ট করে না তা হ'ল সমস্ত মডিউল এবং স্ট্যাটিকালি লিঙ্কযুক্ত লাইব্রেরির সমস্ত বৈশ্বিক চলক আরম্ভ করার ক্রম।


0

হ্যাঁ, বাস্তবায়ন-নির্দিষ্ট এক্সটেনশন ব্যতীত প্রতিটি সি ++ প্রোগ্রামের "এন্ট্রি পয়েন্ট" প্রধান। তবুও কিছু জিনিস প্রধানের আগে ঘটে, বিশেষত গ্লোবাল ইনিশিয়ালেশন যেমন মেইনরেটের জন্য।

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