“ইনট মেন (ভুয়েড)”? ওটা কিভাবে কাজ করে?


135

আমাকে সম্প্রতি একটি ছোট সি পরীক্ষামূলক প্রোগ্রাম টাইপ করতে হয়েছিল এবং প্রক্রিয়াধীন, আমি ঘটনাক্রমে vooidপরিবর্তে ব্যবহার করে মূল ফাংশনে একটি বানান ভুল করেছিলাম void

এবং এখনও এটি কাজ করে।

এটিকে এর ক্ষুদ্রতম সম্পূর্ণ সংস্করণে হ্রাস করে, আমি এখানেই শেষ করেছি:

int main (vooid) {
    return 42;
}

এটি প্রকৃতপক্ষে সংকলন করে ( gcc -Wall -o myprog myprog.c) এবং যখন চালানো হয় তখন তা 42 দেয়।

এই বৈধ কোডটি ঠিক কীভাবে?


bashআমি কী করছি তা দেখানোর জন্য এখানে আমার শেল থেকে একটি প্রতিলিপি কাটা এবং আটকানো হয়েছে :

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

একক intপ্যারামিটারের সাহায্যে প্রধানকে সংজ্ঞায়িত করে আপনি অনির্ধারিত আচরণটি শুরু করবেন । যে কোনও কিছু ঘটতে পারে :)
পিএমজি

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

mainহুঁ : হোস্ট করা পরিবেশে অবশ্যই 2 টি ক্যানোনিকাল ফর্মের একটি থাকতে হবে (2.1.2.2)। তবে আপনি ঠিক @ প্যাক্স, একটি মুক্ত-স্থিত পরিবেশে, শনাক্তকারী কোনওভাবেই mainবিশেষ নয়: যদি কোনও ফাংশন হিসাবে ব্যবহৃত হয় তবে এটি কোনও ধরণের হতে পারে এবং যে কোনও ধরণের প্যারামিটারের সংখ্যা থাকতে পারে।
পিএমজি

2
সি 99 এ, ফ্রিস্ট্যান্ডিং সম্পূর্ণরূপে বাস্তবায়িত সংজ্ঞায়িত। হোস্ট করার জন্য বিভাগের 5.1.2.2.1 এর শেষে "বা অন্য কোনও বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে" বলা হয়েছে যাতে এটি ন্যূনতমভাবে দুটি প্রচলিত ফর্মের প্রয়োজন int main (int argc, char *argv[], char *envp[]);হয় তবে অন্যগুলিও থাকতে পারে (এটি ইউনিক্সকে মেনে চলতে দেয় )।
প্যাক্সিডিয়াবলো

উত্তর:


220

এটি কেবল "পুরানো-স্টাইল" ফাংশন-ডিক্লেয়ারেশন সিনট্যাক্স ব্যবহার করছে; আপনি সুস্পষ্টভাবে intডাকা একটি প্যারামিটার ঘোষণা করছেন vooid


2
এই ক্ষেত্রে মনে করা হয়। যদি আপনি "vooid = 42; রিটার্ন ভুয়েড" যোগ করেন; মূলত, আপনি 42 এর একটি ফেরতের মানও পাবেন
জেফ এমস

43
আরগঃ তুমি ঠিক বলেছো আমি যদি যোগ করি তবে -std=c99আমি পাই qq.c:1: warning: type of 'vooid' defaults to 'int'
paxdiablo

70

এটি বৈধ কোড, কারণ myprog.c এ রয়েছে:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooidএকটি প্লাসে পাস হওয়া আর্গুমেন্টের সংখ্যা (অর্থাত্‍ argc) contains সুতরাং, প্রভাব সমস্ত আপনি করেছেন নামান্তর হয় argcথেকে vooid


11
যদি আপনি "রিটার্ন বর্জন করেন"; পরিবর্তে, এটি প্রকৃতপক্ষে 1 + সংখ্যা দেয়। আরগস এর।
জেফ আমেস

6
@ জেফ, প্রোগ্রামটির নামটি একটি যুক্তি হিসাবে গণ্য করা হয়, সুতরাং + 1
মার্টিন বেকেট

23

সি-তে, একটি ফাংশন আর্গুমেন্টের জন্য ডিফল্ট টাইপ int। সুতরাং, আপনার প্রোগ্রাম শব্দ চিকিত্সা করা হয় vooidযেমন int main(int vooid)যা পুরোপুরি বৈধ কোড হয়।


20

এটি কেবল gcc -std=c89 -Wall -o qq qq.cএবং gcc -std=gnu89 -Wall -o qq qq.cকোনও সতর্কবার্তা প্রকাশ করবেন না। অন্যান্য সমস্ত মান এর intজন্য অন্তর্ভুক্ত প্রকারের সম্পর্কে একটি সতর্কতা নির্গত করে vooid

int main(chart)যেমন করে তেমন আচরণ করে int main (vooid)

return vooid; কমান্ড লাইন আর্গুমেন্টের সংখ্যা প্রদান করে।

আমি ডেবিয়ান টেস্টিং সিস্টেমে জিসিসি 4.4.5 দিয়ে পরীক্ষা করেছি tested

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