কি চলছে এই প্রশ্নের মাংসে goingোকার আগে, এটি উল্লেখ করা গুরুত্বপূর্ণ যে ত্রুটি প্রতিবেদন 1886 অনুসারে প্রোগ্রামটি খারাপভাবে তৈরি হয়েছে : মূল () এর জন্য ভাষা সংযোগ :
[...] এমন একটি প্রোগ্রাম যা বৈশ্বিক স্কোপে একটি পরিবর্তনশীল প্রধান ঘোষণা করে বা সি ভাষার লিঙ্কেজ (যে কোনও নামস্থানে) সহ নাম মেইন ঘোষনা করে তা খারাপ-গঠিত। [...]
ক্ল্যাং এবং জিসিসির সাম্প্রতিকতম সংস্করণগুলি এটিকে ত্রুটি করে তোলে এবং প্রোগ্রামটি সংকলন করবে না ( জিসিসির সরাসরি উদাহরণ দেখুন ):
error: cannot declare '::main' to be a global variable
int main = ( std::cout << "C++ is excellent!\n", 195 );
^
তাহলে কেন সিসিসি এবং বিড়ম্বনার পুরানো সংস্করণগুলিতে কোনও ডায়াগনস্টিক ছিল না? এই ত্রুটি প্রতিবেদনটির 2014 সালের শেষ অবধি প্রস্তাবিত রেজোলিউশনও ছিল না এবং তাই এই কেসটি খুব সম্প্রতি সুস্পষ্টভাবে অসুস্থ হয়ে পড়েছিল, যার জন্য ডায়াগনস্টিক প্রয়োজন।
এর আগে, মনে মত এই অনির্ধারিত আচরণ কেমন হওয়া উচিৎ, যেহেতু আমরা একটি লঙ্ঘন করে তা দেখুন হইবে খসড়া C- এর প্রয়োজন ++, অধ্যায় থেকে মান 3.6.1
[basic.start.main] :
একটি প্রোগ্রামে মূল নামে একটি বিশ্বব্যাপী ফাংশন থাকবে যা প্রোগ্রামটির মনোনীত শুরু। [...]
অপরিজ্ঞাত আচরণটি অনির্দেশ্য এবং এ জন্য ডায়াগনস্টিকের প্রয়োজন হয় না। আচরণটি পুনরুত্পাদন করার সাথে আমরা যে অসঙ্গতি দেখি তা হ'ল সাধারণ অপরিজ্ঞাত আচরণ।
সুতরাং কোডটি আসলে কী করছে এবং কেন কিছু ক্ষেত্রে এটি ফলাফল দেয়? আসুন দেখুন আমাদের কী আছে:
declarator
| initializer----------------------------------
| | |
v v v
int main = ( std::cout << "C++ is excellent!\n", 195 );
^ ^ ^
| | |
| | comma operator
| primary expression
global variable of type int
আমরা আশা করি আপনি main
যা হয় int- এ বিশ্বব্যাপী নামস্থান ঘোষণা এবং সক্রিয়া করা হচ্ছে, পরিবর্তনশীল স্ট্যাটিক স্টোরেজ সময়কাল হয়েছে। এটি প্রয়োগের সংজ্ঞায়িত হয় যে কল করার চেষ্টা করার আগে আরম্ভ হবে কিনা main
তবে এটি প্রদর্শিত হয় জিসিসি কল করার আগে এটি করে না main
।
কোডটি কমা অপারেটর ব্যবহার করে , বাম অপারেন্ডটি একটি বাতিল হওয়া মূল্য প্রকাশ এবং এটি কেবলমাত্র কলিংয়ের পার্শ্ব প্রতিক্রিয়ার জন্য ব্যবহৃত হয় std::cout
। কমা অপারেটরের ফলাফলটি হ'ল অপারেন্ড যা এই ক্ষেত্রে 195
ভেরিয়েবলের জন্য নির্ধারিত অগ্রগতি main
।
আমরা সের্গেজটি জেনারেটেড এসেম্বলি শোগুলি দেখায় যা cout
স্ট্যাটিক ইনিশিয়েশন চলাকালীন বলা হয়। যদিও আলোচনার জন্য আরও আকর্ষণীয় বিষয় লাইভ গডবোল্ট অধিবেশনটি এটি হতে পারে:
main:
.zero 4
এবং পরবর্তী:
movl $195, main(%rip)
সম্ভাব্য পরিস্থিতিটি হ'ল প্রোগ্রামটি main
বৈধ কোডের প্রত্যাশার প্রতীকটিতে চলে আসে এবং কিছু ক্ষেত্রে সেগ-ত্রুটি হয় । সুতরাং যদি এটি হয় তবে আমরা ভেরিয়েবেলে বৈধ মেশিন কোড সংরক্ষণের main
ফলে কার্যকর কর্মসূচী হতে পারে , ধরে নিই আমরা এমন একটি বিভাগে রয়েছি যা কোড প্রয়োগের অনুমতি দেয়। আমরা দেখতে পাচ্ছি 1984 এর এই আইওসিসি এন্ট্রি ঠিক তেমনটি করে ।
দেখা যাচ্ছে আমরা সি সি ব্যবহার করে এটি জিসিসি পেতে পারি ( এটি সরাসরি দেখুন ):
const int main = 195 ;
এটি সিগ-ত্রুটিগুলি যদি ভেরিয়েবলটি main
সম্ভবত নির্ধারিত না হয় কারণ এটি একটি নির্বাহযোগ্য স্থানে অবস্থিত না হয় তবে এই মন্তব্যটির জন্য এখানে হ্যাট টিপ যা আমাকে এই ধারণা দিয়েছে।
এছাড়াও এই প্রশ্নের সি নির্দিষ্ট সংস্করণে এখানে FUZxxl উত্তরটি দেখুন ।