return n( mainফাংশনটিতে) এবং exit(n)সি এর মধ্যে কোনও পার্থক্য আছে কি ? এটি সি বা পসিক্স মান দ্বারা সংজ্ঞায়িত করা হয়েছে বা এটি ওএস বা সংকলকটির উপর নির্ভর করে?
return n( mainফাংশনটিতে) এবং exit(n)সি এর মধ্যে কোনও পার্থক্য আছে কি ? এটি সি বা পসিক্স মান দ্বারা সংজ্ঞায়িত করা হয়েছে বা এটি ওএস বা সংকলকটির উপর নির্ভর করে?
উত্তর:
বেশিরভাগ ক্ষেত্রে, কোনও পার্থক্য নেই, তবে এখানে একটি সি প্রোগ্রাম রয়েছে যা সম্ভবত এটি ব্যবহার করে return 0;বা exit(0);:
#include <stdio.h>
#include <stdlib.h>
static char *message;
void cleanup(void) {
printf("message = \"%s\"\n", message);
}
int main(void) {
char local_message[] = "hello, world";
message = local_message;
atexit(cleanup);
#ifdef USE_EXIT
puts("exit(0);");
exit(0);
#else
puts("return 0;");
return 0;
#endif
}
কারণ atexit()কল, নয়তো exit(0);বা return 0;কারণগুলো cleanupফাংশন প্রার্থনা করা হবে। পার্থক্যটি হ'ল যদি প্রোগ্রামটি কল করে exit(0);তবে "কল" টি main()সক্রিয় থাকাকালীন ক্লিনআপটি ঘটে তাই local_messageঅবজেক্টটি এখনও বিদ্যমান। নির্বাহ return 0;অবশ্য অবিলম্বে নামোচ্চারণের বন্ধ main()এবং তারপর এমন কিছুকে ডাকে, cleanup()ফাংশন। যেহেতু cleanup()(গ্লোবাল messageপয়েন্টারটির মাধ্যমে ) স্থানীয়ভাবে বরাদ্দ করা কোনও বস্তুকে বোঝায় mainএবং সেই বস্তুটির আর অস্তিত্ব নেই, আচরণটি অপরিবর্তিত।
আমি আমার সিস্টেমে যে আচরণটি দেখছি তা এখানে:
$ gcc -DUSE_EXIT c.c -o c && ./c
exit(0);
message = "hello, world"
$ gcc c.c -o c && ./c
return 0;
message = ""
$
প্রোগ্রামটি চালিয়ে যাওয়া -DUSE_EXITক্র্যাশ হওয়া বা মুদ্রণ সহ কিছু করতে পারে "hello, world"(যদি ব্যবহৃত স্মৃতিটি local_messageক্লোবারড না হয়) including
বাস্তবে, যদিও এই পার্থক্যটি কেবল তখনই প্রদর্শিত হয় যদি স্থানীয়ভাবে সংজ্ঞায়িত বস্তুগুলি তাদের পয়েন্টারগুলি সংরক্ষণ করে main()বাইরে দৃশ্যমান করা main()হয়। এটি দুর্ভাগ্যজনকভাবে ঘটতে পারে argv। (আমার সিস্টেমে পরীক্ষা করে দেখায় যেগুলি থেকে ফিরে আসার পরে অবজেক্টগুলি নির্দেশ করে argvএবং *argvঅব্যাহত থাকে main()তবে আপনার উপর নির্ভর করা উচিত নয়))
সি
এর জন্য স্ট্যান্ডার্ড বলছে যে প্রাথমিক কল থেকে মূল দিকে ফিরে আসা কলিং প্রস্থানের সমতুল্য। তবে, মুখ্য থেকে কোনও রিটার্ন কাজ করার আশা করা যায় না যদি ক্লিনআপের সময় স্থানীয় থেকে প্রধান ডেটা প্রয়োজন হয়।
সি ++ এর জন্য
প্রোগ্রাম থেকে প্রস্থান করার জন্য যখন প্রস্থান (0) ব্যবহার করা হয়, স্থানীয়ভাবে স্কোপযুক্ত অ স্থিত বস্তুর জন্য ডেস্ট্রাক্টরদের ডাকা হয় না। তবে রিটার্ন 0 ব্যবহার করা হলে ডেস্ট্রাক্টরদের ডাকা হয়।
প্রোগ্রাম 1 - প্রস্থান করতে প্রস্থান (0) ব্যবহার করে
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
getchar();
}
};
int main() {
Test t1;
// using exit(0) to exit from main
exit(0);
}
আউটপুট: টেস্টের কনস্ট্রাক্টর ভিতরে
প্রোগ্রাম 2 - প্রস্থান করতে 0 ব্যবহার করে
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
}
};
int main() {
Test t1;
// using return 0 to exit from main
return 0;
}
আউটপুট: টেস্টের কনস্ট্রাক্টর
ইনসাইড টেস্টের ডেস্ট্রাক্টর
ডেস্ট্রাক্টরদের কল করা কখনও কখনও গুরুত্বপূর্ণ, উদাহরণস্বরূপ, যদি ডেস্ট্রাক্টরের কাছে ফাইলগুলি বন্ধ করার মতো সংস্থানগুলি রিলিজ করার কোড থাকে।
নোট করুন যে স্থির বস্তুগুলি পরিষ্কার হয়ে যাবে এমনকি যদি আমরা প্রস্থান () বলি। উদাহরণস্বরূপ, নীচের প্রোগ্রামটি দেখুন।
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
getchar();
}
};
int main() {
static Test t1; // Note that t1 is static
exit(0);
}
আউটপুট: টেস্টের কনস্ট্রাক্টর
ইনসাইড টেস্টের ডেস্ট্রাক্টর
finally
যে সি মানক (C99) লক্ষ তার মূল্য সঞ্চালনের পরিবেশের, দুই ধরনের সংজ্ঞায়িত Freestanding পরিবেশ এবং Hosted পরিবেশ । ফ্রিস্ট্যান্ডিং এনভায়রনমেন্ট হ'ল সি পরিবেশ যা সি লাইব্রেরিগুলিকে সমর্থন করে না এবং এম্বেডেড অ্যাপ্লিকেশন এবং এ জাতীয় পছন্দগুলির জন্য। এসি পরিবেশ যা সি লাইব্রেরিগুলিকে সমর্থন করে তাকে হোস্ট করা পরিবেশ বলে।
সি 99 বলেছেন, একটি ফ্রিস্ট্যান্ডিং এনভায়রনমেন্ট প্রোগ্রামে সমাপ্তি বাস্তবায়ন সংজ্ঞায়িত হয়। সুতরাং, যদি বাস্তবায়ন সংজ্ঞায়িত হয় main, return nএবং exit, তাদের আচরণগুলি যেমন বাস্তবায়নের সংজ্ঞায়িত হয়।
C99 হোস্ট করা পরিবেশের আচরণটি এরূপ হিসাবে সংজ্ঞায়িত করে,
মূল ফাংশনের রিটার্ন টাইপ যদি এর সাথে সামঞ্জস্যপূর্ণ টাইপ হয় তবে প্রাথমিক কল থেকে মূল ফাংশনে প্রত্যাবর্তন তার আর্গুমেন্ট হিসাবে মূল ফাংশন দ্বারা প্রত্যাবর্তিত মানের সাথে প্রস্থান ফাংশনকে কল করার সমতুল্য; মূল ফাংশনটি শেষ করে এমন} এ পৌঁছানো ০ এর মান দেয় the যদি ফেরতের ধরণটি ইন্টের সাথে সামঞ্জস্য না করে তবে হোস্ট পরিবেশে ফিরে আসা সমাপ্তির স্থিতি অনির্দিষ্ট।
সি স্ট্যান্ডার্ডের দৃষ্টিকোণ থেকে, সত্যই নয়, returnবিবৃতি exit()হওয়া এবং একটি ফাংশন হওয়া ছাড়া অন্যটি । হয় atexit()কর্মসূচির সমাপ্তির পরে যার সাথে নিবন্ধিত কোনও ক্রিয়াকলাপ ডেকে আনে।
আপনি বেশ কয়েকটি পরিস্থিতি দেখতে চান:
main()। বাস্তবে খুব কমই দেখা গেলেও এটি সিটিতে আইনী (সি ++ স্পষ্টভাবে এটি নিষেধ করে))main()। কখনও কখনও একটি বিদ্যমান main()কিছু নতুন নামকরণ করা হবে এবং একটি নতুন দ্বারা ডাকা হবে main()।exit()আপনার কোডটি লেখার পরে যদি এর মধ্যে দুটি ঘটে তবে এর ব্যবহার একটি বাগ প্রবর্তন করবে, বিশেষত যদি অস্বাভাবিকভাবে শেষ না করে। এটি এড়ানোর জন্য, এটি যে main()ফাংশনটি হিসাবে ব্যবহার করা হবে এবং returnআপনি যখন এটি শেষ করতে চান তখন ব্যবহার করার অভ্যাসে থাকা ভাল ধারণা ।