'ইনট মেন;' একটি বৈধ সি / সি ++ প্রোগ্রাম?


113

আমি জিজ্ঞাসা করি কারণ আমার সংকলকটি এমনটি মনে করে, যদিও আমি তা করি না।

echo 'int main;' | cc -x c - -Wall
echo 'int main;' | c++ -x c++ - -Wall

ঝাঁকুনি এটি দিয়ে কোনও সতর্কতা বা ত্রুটি জারি করে না এবং জিসিসি কেবল নম্র সতর্কতা জারি করে: 'main' is usually a function [-Wmain]তবে কেবল সি হিসাবে সংকলন করার সময় এটিকে নির্দিষ্ট করা -std=কোনও বিষয় মনে হয় না।

অন্যথায়, এটি সংকলন করে এবং জরিমানা করে। কিন্তু মৃত্যুদণ্ড কার্যকর হওয়ার সাথে সাথে, এটি অবিলম্বে SIGBUS(আমার জন্য) সমাপ্ত হয় ।

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

কিন্তু কেন? এর জন্য কি কিছু অদ্ভুত প্রান্ত-মামলা বা "historicalতিহাসিক" ব্যবহার রয়েছে? কেউ কি জানে কী দেয়?

আমার বক্তব্য, আমি মনে করি, আমি কি সত্যই মনে করি এটি একটি পরিবেশিত পরিবেশে একটি ত্রুটি হওয়া উচিত , তাই না?


6
gcc -std=c99 -pedantic ...
জিসিসি এ

3
@ পিএমজি এটির সাথে বা বাইরে -pedanticবা কোনওরকম সতর্কতা -std। আমার সিস্টেমটিও c99সতর্কতা বা ত্রুটি ছাড়াই এটি সঙ্কলন করে ...
জেফ নিক্সন

3
দুর্ভাগ্যক্রমে, আপনি যদি "যথেষ্ট চালাক" হন তবে আপনি এমন কিছু তৈরি করতে পারেন যা সংকলক দ্বারা গ্রহণযোগ্য তবে তা বোঝায় না। এই ক্ষেত্রে, আপনি সি রানটাইম লাইব্রেরিটিকে একটি ভেরিয়েবল কল করতে লিঙ্ক করছেন main, যা কাজ করার সম্ভাবনা কম। আপনি যদি "ডান" মান দিয়ে মূল সূচনা করেন তবে এটি আসলে ফিরে আসতে পারে ...
ম্যাট পিটারসন

7
এবং এটি বৈধ হলেও, এটি করা একটি ভয়াবহ কাজ (অপঠনযোগ্য কোড)। বিটিডাব্লু, এটি হোস্টেড বাস্তবায়ন এবং মুক্ত-স্থায়ী বাস্তবায়নে (যা সম্পর্কে জানেন না main) আলাদা হতে পারে
বেসিল স্টারিনকিভিচ

1
আরও মজাদার সময়ের জন্য, চেষ্টা করুনmain=195;
আইমলেটটি

উত্তর:


97

প্রশ্নটি যেহেতু সি এবং সি ++ হিসাবে ডাবল ট্যাগড, তাই সি ++ এবং সি এর যুক্তিটি ভিন্ন হবে:

  • সি ++ লিঙ্কারকে বিভিন্ন ধরণের টেক্সটিকালি অভিন্ন চিহ্নগুলির মধ্যে পার্থক্য করতে সহায়তা করতে নাম ম্যাঙ্গেলিং ব্যবহার করে, যেমন একটি গ্লোবাল ভেরিয়েবল xyzএবং একটি ফ্রি-স্ট্যান্ডিং গ্লোবাল ফাংশন xyz(int)। তবে নামmain কখনও ম্যাঙ্গাল হয় না।
  • সি ম্যাংলিং ব্যবহার করে না, সুতরাং কোনও প্রোগ্রামের পক্ষে লিঙ্কারকে ভিন্ন প্রতীকের জায়গায় এক ধরণের প্রতীক সরবরাহ করে বিভ্রান্ত করা এবং প্রোগ্রামটি সফলভাবে সংযুক্ত করা সম্ভব।

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

এখানে একই ইস্যুটির আরও একটি চিত্রণ দেওয়া হল:

ফাইল এক্সসি:

#include <stdio.h>
int foo(); // <<== main() expects this
int main(){
    printf("%p\n", (void*)&foo);
    return 0;
}

ফাইল ইউসি:

int foo; // <<== external definition supplies a symbol of a wrong kind

সংকলন:

gcc x.c y.c

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

সতর্কবার্তাটি যতদূর যায়, আমি মনে করি এটি যুক্তিসঙ্গত: সি আপনাকে কোনও লাইব্রেরি তৈরি করতে দেয় যার কোনও mainফাংশন নেই, তাই mainআপনাকে যদি mainকোনও অজানা কারণে কোনও ভেরিয়েবল সংজ্ঞায়িত করতে হয় তবে সংকলক অন্যান্য ব্যবহারের জন্য নামটি মুক্ত করে ।


3
যদিও, সি ++ সংকলক মূল ফাংশনটিকে আলাদাভাবে আচরণ করে। বহিরাগত "সি" ছাড়াও এর নাম ম্যাঙ্গেল করা হয় না। আমি অনুমান করি এটি কারণ কারণ লিঙ্কটি নিশ্চিত করার জন্য এটির নিজের বাহ্যিক "সি" প্রধানটি নির্গত করতে হবে।
UldisK

@ ইউল্ডিস্ক হ্যাঁ, আমি নিজে এটি লক্ষ্য করেছি এবং এটি বেশ আকর্ষণীয় মনে হয়েছে। এটি বোধগম্য, তবে আমি কখনই সে সম্পর্কে ভাবিনি।
জিওফ নিকসন

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

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

1
প্রতীক প্রধানটি ম্যাংলিং নামের সাপেক্ষে অপ্রাসঙ্গিক। সি ++ স্ট্যান্ডার্ডে নাম ম্যাঙ্গালিংয়ের কোনও উল্লেখ নেই। নাম ম্যাংলিং একটি বাস্তবায়ন সমস্যা।
ডেভিড হামেন

30

mainএকটি নয় সংরক্ষিত শব্দ এটি শুধু একটি ব্যাপার পূর্বনির্ধারিত আইডেন্টিফায়ার (যেমন cin, endl, npos...), তাই আপনি একটি পরিবর্তনশীল নামক ডিক্লেয়ার পারে main, এটা আরম্ভ এবং তারপর এর মান প্রিন্ট আউট।

অবশ্যই:

  • সতর্কতাটি কার্যকর কারণ এটি বেশ ত্রুটিযুক্ত;
  • main()ফাংশন (গ্রন্থাগার) ছাড়া আপনার উত্স ফাইল থাকতে পারে ।

সম্পাদনা

কিছু তথ্যসূত্র:

  • main কোনও সংরক্ষিত শব্দ নয় (সি ++ 11):

    ফাংশনটি mainকোনও প্রোগ্রামের মধ্যে ব্যবহার করা হবে না। এর যোগসূত্রটি (3.5) mainবাস্তবায়ন-সংজ্ঞায়িত। একটি প্রোগ্রাম যা প্রধান সংজ্ঞায়িত মুছে ফেলা বা যে প্রধান ঘোষণা করে হতে inline, staticঅথবা constexprমন্দ গঠিত হয়। নামটি mainঅন্যথায় সংরক্ষিত নয়। [উদাহরণস্বরূপ: সদস্য ফাংশন, শ্রেণি এবং গণনাগুলি বলা যেতে পারে main, যেমন অন্যান্য নামের জায়গাগুলিতে সত্তাও। - শেষ উদাহরণ]

    সি ++ 11 - [বেসিক.স্টার্ট.মাইন] 3.6.1.3

    [২.১১ / ৩] [...] কিছু শনাক্তকারী সি ++ বাস্তবায়ন এবং স্ট্যান্ডার্ড লাইব্রেরি দ্বারা ব্যবহারের জন্য সংরক্ষিত (17.6.4.3.2) এবং অন্যথায় ব্যবহার করা হবে না; কোন ডায়গনিস্টিক প্রয়োজন হয় না।

    [১.6..6..4.৩.২ / ১] কিছু নাম এবং ফাংশন স্বাক্ষরগুলির সেটগুলি সর্বদা প্রয়োগের জন্য সংরক্ষিত থাকে:

    • প্রতিটি নাম যাতে ডাবল আন্ডারস্কোর __ থাকে বা আন্ডারস্কোর দিয়ে শুরু হয় তারপরে বড় হাতের অক্ষর (2.12) কোনও ব্যবহারের জন্য প্রয়োগের জন্য সংরক্ষিত থাকে।
    • আন্ডারস্কোর দিয়ে শুরু হওয়া প্রতিটি নাম গ্লোবাল নেমস্পেসে নাম হিসাবে ব্যবহারের জন্য প্রয়োগের জন্য সংরক্ষিত।
  • প্রোগ্রামিং ভাষায় সংরক্ষিত শব্দ

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


- আমি অনুমান আমি বরং সত্য দ্বারা প্রতারিত করছি যে (যেমন হয় , যাতে প্রবণ ত্রুটি), কেন এই একটি সতর্কবার্তা নেই (কোনো ত্রুটি), এবং কেন এটা কেবলমাত্র একটি সতর্কতামূলক যখন যেমন সি কম্পাইল হয় - নিশ্চিত, তোমাকে ছাড়া কম্পাইল করতে পারেন একটি main()ফাংশন, কিন্তু আপনি এটি প্রোগ্রাম হিসাবে লিঙ্ক করতে পারবেন না। এখানে যা ঘটছে তা হ'ল একটি "বৈধ" প্রোগ্রামটি যুক্ত করা হচ্ছে main(), কেবলমাত্র একটি main
জিওফ নিকসন

7
cinএবং endlএটি ডিফল্ট নেমস্পেসে নেই - এগুলি stdনেমস্পেসে রয়েছে। nposএকজন সদস্য std::basic_string
আরেকটি পার্কার

1
main হয় একটি বিশ্বব্যাপী নামের সংরক্ষিত। আপনি উল্লিখিত বা অন্যান্য বিষয়গুলির mainকোনওটিরই পূর্বনির্ধারিত নয়।
পোটোসওয়টার

1
কী mainহতে দেওয়া হচ্ছে তার সীমাবদ্ধতার জন্য C ++ 14 §3.6.1 এবং C11 §5.1.2.2.1 দেখুন । সি ++ বলেছেন "একটি বাস্তবায়ন মূল ফাংশনটিকে পূর্বনির্ধারণ করতে পারে না" এবং সি বলেছে "বাস্তবায়ন এই ফাংশনের জন্য কোনও প্রোটোটাইপ ঘোষণা করে না।"
পোটোটোভটার

@ ম্যানলিও: আপনি কী উদ্ধৃত করছেন তা দয়া করে পরিষ্কার করুন। সরল সি হিসাবে উদ্ধৃতিগুলি ভুল। সুতরাং আমি অনুমান করি এটি কোন সি ++ মানের নয়?
7'15

19

কি int main; একটি বৈধ সি / সি ++ প্রোগ্রাম?

কোনও সি / সি ++ প্রোগ্রাম কী তা সম্পূর্ণ পরিষ্কার নয়।

কি int main;একটি বৈধ সি প্রোগ্রাম?

হ্যাঁ. একটি freeestanding বাস্তবায়ন যেমন প্রোগ্রাম গ্রহণ করার অনুমতি দেওয়া হয়। mainএকটি নিখরচায় পরিবেশে কোনও বিশেষ অর্থ থাকতে হবে না।

এটি কোনও হোস্ট করা পরিবেশে বৈধ নয়

কি int main;একটি বৈধ সি ++ প্রোগ্রাম?

পূর্বোক্ত।

কেন এটি ক্রাশ হয়?

প্রোগ্রামটি আপনার পরিবেশে কোনও ধারণা রাখার দরকার নেই । একটি মুক্ত পরিবেশে প্রোগ্রামের সূচনা এবং সমাপ্তি এবং এর অর্থ mainবাস্তবায়ন-সংজ্ঞায়িত হয়।

সংকলক আমাকে কেন সতর্ক করে?

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

কি gccএকটি freestanding পরিবেশ, বা এটি একটি হোস্ট পরিবেশ তৈরী হবে?

হ্যাঁ.

gcc নথি -ffreestandingসংকলন পতাকা । এটি যোগ করুন, এবং সতর্কতা চলে যায়। যেমন কার্নেল বা ফার্মওয়্যার নির্মাণের সময় আপনি এটি ব্যবহার করতে চাইতে পারেন want

g++এই জাতীয় পতাকা নথি করে না। সরবরাহ করার ফলে এই প্রোগ্রামটির কোনও প্রভাব নেই বলে মনে হচ্ছে। এটি সম্ভবত ধরে নেওয়া নিরাপদ যে জি ++ সরবরাহিত পরিবেশটি হোস্ট করা হয়েছে। এই ক্ষেত্রে ডায়াগনস্টিকের অনুপস্থিতি একটি বাগ।


17

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

রসিকতা হিসাবে, আপনি এর মতো কিছু করতে পারেন

int main = 0xCBCBCBCB;

একটি x86 মেশিনে এবং সতর্কতা এবং অনুরূপ জিনিস উপেক্ষা করে, এটি কেবল সংকলন করবে না তবে বাস্তবে এটিও কার্যকর হবে।

কেউ এক্সিকিউটেবল (বাছাই করা) লেখার জন্য এর অনুরূপ একটি কৌশল ব্যবহার করেছিলেন যা সরাসরি একাধিক আর্কিটেকচারে চলে - http://phrack.org/issues/57/17.html#article । এটি আইওসিসি - http://www.ioccc.org/1984/mulleender/mulleender.c- তে জিততেও ব্যবহৃত হয়েছিল ।


1
"এটি একটি সতর্কতা কারণ এটি প্রযুক্তিগতভাবে অনুমোদিত নয়" - এটি সি ++ এ অবৈধ।
চিয়ার্স এবং এইচটিএইচ - আলফ

3
"তিনটি স্ট্যান্ডার্ড আর্গুমেন্ট (আরগসি, আরজিভি এবং এনভিপি)" - এখানে আপনি সম্ভবত পিক্সিক্স স্ট্যান্ডার্ডের কথা বলছেন।
চিয়ার্স এবং এইচটিএইচ - আলফ

আমার সিস্টেমে (উবুন্টু 14 / x64), নিম্নলিখিত লাইনটি int main __attribute__ ((section (".text")))= 0xC3C3C3C3;
জিসিসি

@ চিয়ারসান্থ.-আলফ প্রথম দুটি মানসম্মত, তৃতীয়টি পসিক্স।
ডিস্ক্যান্ডি

9

এটি কি একটি বৈধ প্রোগ্রাম?

না।

এটি কোনও কর্মসূচী অংশ না হওয়ায় এটি কোনও প্রোগ্রাম নয়।

এটি সংকলন বৈধ?

হ্যাঁ.

এটি একটি বৈধ প্রোগ্রাম সঙ্গে ব্যবহার করা যেতে পারে?

হ্যাঁ.

সমস্ত সংকলিত কোড বৈধ হওয়ার জন্য নির্বাহযোগ্য হতে হবে না। উদাহরণগুলি স্থির এবং গতিশীল লাইব্রেরি হয়।

আপনি কার্যকরভাবে একটি অবজেক্ট ফাইল তৈরি করেছেন। এটি বৈধ এক্সিকিউটেবল নয়, তবে অন্য প্রোগ্রামটি mainরানটাইম সময়ে লোড করে ফলাফল ফাইলটিতে বস্তুর সাথে লিঙ্ক করতে পারে ।

এটি একটি ত্রুটি হওয়া উচিত?

Ditionতিহ্যগতভাবে, সি ++ ব্যবহারকারীকে এমন কিছু করার অনুমতি দেয় যা দেখে মনে হয় যে তাদের কোনও বৈধ ব্যবহার নেই তবে ভাষার বাক্য গঠনের সাথে এটি খাপ খায়।

আমি নিশ্চিত যে নিশ্চিত, এটি একটি ত্রুটি হিসাবে পুনরায় শ্রেণিবদ্ধ করা যেতে পারে, তবে কেন? এই উদ্দেশ্যটি কী সতর্ক করবে না তা পরিবেশন করবে?

যতক্ষণ না প্রকৃত কোডে এই কার্যকারিতাটি ব্যবহারের তাত্ত্বিক সম্ভাবনা রয়েছে ততক্ষণ এটি সম্ভবত খুব কমই বলা যায় যে কোনও ফাংশনবিহীন বস্তুর নামকরণ mainভাষা অনুসারে ত্রুটি ঘটায়।


এটি নামের বাইরে একটি বহিরাগত দৃশ্যমান প্রতীক তৈরি করে main। একটি বৈধ প্রোগ্রাম, যার নামের সাথে অবশ্যই কোনও বহিরাগত দৃশ্যমান ফাংশনmain থাকতে হবে, এটির লিঙ্ক কীভাবে থাকতে পারে?
কিথ থম্পসন

রানটাইমটিতে @ কিথথম্পসন লোড করুন। স্পষ্ট করে দেবে।
মাইকেল গাজোন্ডা

এটি কারণ এটি প্রতীক প্রকারের মধ্যে পার্থক্য বলতে সক্ষম হয় না। লিঙ্কিং ঠিক কাজ করে - কার্যকর (সাবধানে তৈরি করা ব্যতীত) কার্যকর হয় না।
ক্রিস স্ট্রাটন

1
@ ক্রিসট্রেটটন: আমি মনে করি কেথের যুক্তিটি হচ্ছে যে লিঙ্কটি ব্যর্থ হয়েছে কারণ প্রতীকটি বহুগুণ সংজ্ঞায়িত হয়েছে ... কারণ "বৈধ প্রোগ্রাম" কোনও বৈধ প্রোগ্রাম হতে পারে না যতক্ষণ না এটি একটি সংজ্ঞা দেয় main কার্যকারিতা ।
বেন ভয়েগট

@ বেনভয়েগ্ট তবে এটি যদি কোনও লাইব্রেরিতে প্রদর্শিত হয়, তবে লিঙ্কিং ব্যর্থ হবে না (এবং সম্ভবত সম্ভব নয়) কারণ প্রোগ্রামের লিঙ্ক-টাইমে, int main; সংজ্ঞাটি দৃশ্যমান হবে না।

6

আমি প্রকৃত ভাষার মান উল্লেখ করে ইতিমধ্যে দেওয়া উত্তরগুলিতে যুক্ত করতে চাই।

'ইনট মেন;' একটি বৈধ সি প্রোগ্রাম?

সংক্ষিপ্ত উত্তর (আমার মতামত): কেবলমাত্র যদি আপনার বাস্তবায়নটি "ফ্রিস্ট্যান্ডিং কার্যকর মৃত্যুর পরিবেশ" ব্যবহার করে।

সি 11 থেকে নিম্নলিখিত সমস্ত উদ্ধৃতি

5. পরিবেশ

একটি বাস্তবায়ন সি উত্স ফাইলগুলি অনুবাদ করে এবং দুটি ডেটাপ্রসেসিং-সিস্টেম পরিবেশে সি প্রোগ্রামগুলি কার্যকর করে, যাকে অনুবাদ পরিবেশ এবং কার্যকরকরণ পরিবেশ বলা হবে [...]

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

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

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

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

5.1.2.2 হোস্ট পরিবেশ

একটি হোস্ট করা পরিবেশ সরবরাহ করার প্রয়োজন নেই, তবে উপস্থিত থাকলে নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে সঙ্গতিপূর্ণ হবে।

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

প্রোগ্রাম স্টার্টআপ নামক ফাংশনটির নামকরণ করা হয় মূল । [...] এটি কোনও রিটার্ন টাইপ ইন্ট এবং কোনও পরামিতি [...] বা দুটি পরামিতি সহ [...] বা সমতুল্য বা অন্য কোনও বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে সংজ্ঞায়িত করা হবে।

এগুলি থেকে নিম্নলিখিতটি পর্যবেক্ষণ করা হচ্ছে:

  • একটি সি 11 প্রোগ্রামে একটি ফ্রিস্ট্যান্ডিং বা হোস্টেড এক্সিকিউশন পরিবেশ থাকতে পারে এবং বৈধ হতে পারে।
  • যদি এটি একটি ফ্রিস্ট্যান্ডিং থাকে তবে একটি প্রধান ফাংশন থাকার প্রয়োজন নেই।
  • অন্যথায়, int টাইপের রিটার্ন ভ্যালির সাথে অবশ্যই একটি থাকতে হবে ।

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

'ইনট মেন;' একটি বৈধ সি ++ প্রোগ্রাম?

সংক্ষিপ্ত উত্তর (আমার মতামত): কেবলমাত্র যদি আপনার বাস্তবায়নটি "ফ্রিস্ট্যান্ডিং কার্যকর মৃত্যুর পরিবেশ" ব্যবহার করে।

সি ++ 14 থেকে উদ্ধৃতি

3.6.1 মূল ফাংশন

একটি প্রোগ্রামে মূল নামে একটি বিশ্বব্যাপী ফাংশন থাকবে যা প্রোগ্রামটির মনোনীত শুরু। এটি ফ্রিস্ট্যান্ডিং পরিবেশে কোনও প্রোগ্রামের কোনও মূল কার্যকারিতা সংজ্ঞায়িত করার প্রয়োজন কিনা তা বাস্তবায়ন-সংজ্ঞায়িত। [...] এটিতে প্রকারের রিটার্ন টাইপ থাকবে, তবে অন্যথায় এর প্রকারটি বাস্তবায়ন-সংজ্ঞায়িত। [...] নামটির নামটি অন্যথায় সংরক্ষিত নয়।

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

আবার আমি যুক্তি দেব যে হোস্ট করা মামলার জন্য, আপনার কোডটি একটি বৈধ সি ++ 14 প্রোগ্রাম নয়, তবে আমি নিশ্চিত যে এটি ফ্রিস্ট্যান্ডিংয়ের ক্ষেত্রে।

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


4

আমার বক্তব্য, আমি মনে করি, আমি কি সত্যই মনে করি এটি একটি পরিবেশিত পরিবেশে একটি ত্রুটি হওয়া উচিত, তাই না?

ত্রুটি আপনার। আপনি এমন কোনও ফাংশন নির্দিষ্ট করেন নি mainযা একটি ফেরত দেয়int এবং কোনও হোস্ট করা পরিবেশে আপনার প্রোগ্রামটি ব্যবহার করার চেষ্টা করে।

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

ধরুন আপনার কাছে অন্য একটি সংকলন ইউনিট রয়েছে যা একটি বিশ্বব্যাপী ফাংশন সংজ্ঞায়িত করে mainযা intকোনও রিটার্ন দেয় এবং কোনও আর্গুমেন্ট নেয় না। একটি হোস্ট করা পরিবেশে একটি প্রোগ্রামের ঠিক এটি প্রয়োজন।

আপনি যদি কেবলমাত্র একটি নিরস্ত পরিবেশে প্রথম সংকলন ইউনিট ব্যবহার করেন এবং কেবল কোনও হোস্ট করা পরিবেশে দ্বিতীয়টি ব্যবহার করেন তবে সবকিছু ঠিক আছে। আপনি যদি একটি প্রোগ্রামে উভয় ব্যবহার করেন? সি ++ এ আপনি একটি সংজ্ঞা বিধি লঙ্ঘন করেছেন। এটি অনির্ধারিত আচরণ। সি-তে, আপনি সেই নিয়ম লঙ্ঘন করেছেন যা নির্দেশ করে যে একক চিহ্নের সমস্ত উল্লেখ অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে; যদি তারা না হয় তবে এটি নির্ধারিত আচরণ। অপরিবর্তিত আচরণ হ'ল "জেল থেকে মুক্তি পান!" একটি বাস্তবায়ন বিকাশকারীদের কার্ড। অপরিবর্তিত আচরণের প্রতিক্রিয়া হিসাবে একটি বাস্তবায়ন যা কিছু করে তা মানের সাথে সঙ্গতিপূর্ণ। বাস্তবায়নের জন্য সতর্ক করতে হবে না, একা ধরা যাক, অপরিজ্ঞিত আচরণ।

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

এটি সি ++ তে কিছুটা কম স্পষ্ট কারণ mainএকটি পরিবেশিত পরিবেশে ফাংশনটি সংজ্ঞায়িত করতে ব্যর্থতা অপরিজ্ঞাত আচরণের পরিবর্তে একটি ত্রুটি (অন্য কথায়, এটি অবশ্যই সনাক্ত করা উচিত)। তবে, সি ++ এর একটি সংজ্ঞা বিধি মানে লিংকারগুলি বরং বোবা হতে পারে। লিঙ্কারের কাজটি বাহ্যিক রেফারেন্সগুলি সমাধান করছে, এবং একটি সংজ্ঞা নিয়মের জন্য ধন্যবাদ, লিঙ্কারে এই চিহ্নগুলির অর্থ কী তা জানতে হবে না। আপনি নামের একটি প্রতীক সরবরাহ করেছেন main, লিঙ্কার একটি প্রতীক নামটি প্রত্যাশা করছেন main, সুতরাং লিঙ্কারের সাথে যতটা ਸੰਬੰਧ রয়েছে ততই ভাল।


4

সি এর জন্য এটি এখন পর্যন্ত বাস্তবায়িত সংজ্ঞায়িত আচরণ।

যেমন আইএসও / আইইসি 9899 বলেছেন:

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

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

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

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

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

বা সমমানের; বা অন্য কিছু বাস্তবায়ন সংজ্ঞায়িত পদ্ধতিতে।


3

না, এটি কোনও বৈধ প্রোগ্রাম নয়।

সি ++ এর জন্য সম্প্রতি 1886 এর ত্রুটি প্রতিবেদন দ্বারা এটি স্পষ্টভাবে খারাপভাবে তৈরি হয়েছিল : মূল () এর ভাষাগুলির সংযোগ যা বলে:

মূল () কে একটি স্পষ্ট ভাষা সংযোগ দেওয়ার ক্ষেত্রে কোনও বিধিনিষেধের উপস্থিতি উপস্থিত হয় না, তবে এটি সম্ভবত দুর্গঠিত বা শর্তাধীন-সমর্থিত হওয়া উচিত।

এবং রেজোলিউশনের অংশে নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত ছিল:

এমন একটি প্রোগ্রাম যা বৈশ্বিক স্কোপে একটি পরিবর্তনশীল প্রধান ঘোষনা করে বা সি ভাষার লিঙ্কেজ (যে কোনও নামস্থানে) সহ নাম মেইনটিকে ঘোষিত করে ill

আমরা সর্বশেষ সি ++ খসড়া মানক N4527 এ এই শব্দটি খুঁজে পেতে পারি যা সি ++ 1z খসড়াটি খুঁজে পেতে পারি।

ক্ল্যাং এবং জিসিসি উভয়ের সর্বশেষতম সংস্করণগুলি এটিকে ত্রুটি করে তোলে ( এটি সরাসরি দেখুন ):

error: main cannot be declared as global variable
int main;
^

এই ত্রুটিযুক্ত প্রতিবেদনের আগে, এটি অনির্ধারিত আচরণ ছিল যা ডায়াগনস্টিকের প্রয়োজন হয় না। অন্যদিকে দুর্বল কোডটি ডায়াগনস্টিকের প্রয়োজন, সংকলকটি হয় এটি একটি সতর্কতা বা ত্রুটি তৈরি করতে পারে।


আপডেটের জন্য ধন্যবাদ! এটি এখন সংকলক ডায়াগনস্টিক্সের সাথে বাছাই করা দেখে দুর্দান্ত। তবে, অবশ্যই বলতে হবে আমি সি ++ স্ট্যান্ডার্ড বিভ্রান্তির পরিবর্তনগুলি খুঁজে পেয়েছি। (পটভূমির জন্য, নাম ম্যাংলিং সম্পর্কিত উপরের মন্তব্যগুলি দেখুন see main()) আমি main()স্পষ্টত লিঙ্কেজ-স্পেসিফিকেশন থাকা থেকে বঞ্চিত করার যৌক্তিকতাটি বুঝতে পারি , তবে সি ++ লিঙ্কেজ থাকা আবশ্যক তা আমি বুঝতে পারি না । অবশ্যই স্ট্যান্ডার্ডটি কীভাবে এবিআই লিঙ্কেজ / নাম ম্যাংলিং পরিচালনা করতে পারে তা সরাসরি সম্বোধন করে না, তবে বাস্তবে (বলুন, Itanium ABI এর সাথে) এটি মঙ্গলে যেতে পারে । আমি কী মিস করছি? main()main()_Z4mainv
জিফ নিক্সন

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