আমি কি EXIT_SUCCESS বা 0 থেকে মূল () থেকে ফিরে আসব?


124

এটি একটি সাধারণ প্রশ্ন, তবে আমি বিবাদমূলক উত্তরগুলি দেখতে পাচ্ছি: একটি সি ++ প্রোগ্রামের মূল রুটিনটি ফিরে আসা উচিত 0নাকি EXIT_SUCCESS?

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

অথবা

int main(){return 0;}

তারা কি ঠিক একই জিনিস? করা উচিত EXIT_SUCCESSশুধুমাত্র সঙ্গে ব্যবহার করা exit()?

আমি ভেবেছিলাম EXIT_SUCCESSএটি আরও ভাল বিকল্প হবে কারণ অন্যান্য সফ্টওয়্যার শূন্যকে ব্যর্থতা হিসাবে বিবেচনা করতে পারে, তবে আমি শুনেছি যে আপনি যদি ফিরে যান 0তবে সংকলক যেভাবেই এটি আলাদা মান হিসাবে পরিবর্তন করতে সক্ষম।


এটা কি তোমার প্রশ্নের উত্তর? stackoverflow.com/questions/1188335/...
Blastfurnace

2
সি 90 সম্পর্কে এই উত্তরটি মানকে প্যারাফ্রেস করে - 0এবং EXIT_SUCCESSউভয়ই সাফল্য হিসাবে ব্যাখ্যা করা হয়।
ta.speot.is

আমি এখানে প্রতিক্রিয়া জানাই যেহেতু আমার মনে হয় ভবিষ্যতে অন্য কেউ এটি পড়বে। মূলত "সঠিক সি" দেখতে দেখতে অনেকগুলি দৃষ্টান্ত রয়েছে। কিছু দৃষ্টান্ত ম্যাক্রোগুলির উপরে আক্ষরিক ব্যবহার পছন্দ করে, উদাহরণস্বরূপ, আর্গুমেন্ট হিসাবে NULL পাস করার পরিবর্তে, তারা (কন্সট চর *) 0 পার হতে পারে এটি নির্দেশ করে যে এটি কেবল নাল নয়, তবে এটি নਾਲ না হলে এটি হওয়া উচিত ধ্রুবক অক্ষর নির্দেশক। অন্যান্য দৃষ্টান্তগুলি টাইপ অগ্নোস্টিক হওয়া এবং ম্যাক্রো প্রকারগুলি ব্যবহার করে পছন্দ হয় যখন জিনিসগুলি আমূল পরিবর্তন করে তখন তাদের কোডবেস পরিবর্তন করার প্রয়োজন এড়াতে পারে। উদাহরণস্বরূপ, অনেক -
দিমিত্রি

@ দিমিত্রি <সংযুক্ত> নতুন প্ল্যাটফর্মগুলিতে উইন্ডোজ এপিআই টাইপ সংজ্ঞাগুলি সঠিক নয়, তবে যেহেতু তারা ম্যাক্রোগুলি ছিলেন, ম্যাক্রোটিকে নতুনভাবে সংজ্ঞায়িত করে যাঁরা কাজ করেন তাদের কাছে সমস্ত ধরণের পরিবর্তন করার সহজ উপায় ছিল এবং এই ধরণের বেশিরভাগই কেবল সংজ্ঞা দ্বারা ছোট করে তোলা হয়েছিল (উদা। int বিভিন্ন প্ল্যাটফর্মগুলিতে আলাদা হয়)। সংক্ষিপ্তসার হিসাবে, রিটার্ন কোডটি বিবেচিত হয় এবং ভবিষ্যতে পরিবর্তিত হতে পারে EXIT_SUCCESS এর মতো জিনিসগুলি ব্যবহার করুন, অন্যথায় 0 ফেরত নেওয়া যাদু সংখ্যার মতো মনে হতে পারে তবে এটি এখনও পুরোপুরি বৈধ স্ট্যান্ডার্ড কনভেনশন। ত্রুটি কোডটি বেশিরভাগ প্রোগ্রামগুলিকে একের পর এক নম্বর ফলাফলের পাইপ দেওয়ার জন্য -
দিমিত্রি

@ দিমিত্রি <কন্টিনিউড> আপনার প্রোগ্রামটি ডিবাগ করার জন্য ত্রুটি কোডগুলি ব্যবহার করা কিছুটা দূর্বল, যেহেতু এটি 0 ফিরে আসে তবে কোনও প্রোগ্রামে অবিস্মরণহীন ত্রুটি রয়েছে যা প্রোগ্রামটি নিঃশব্দে ভাঙ্গতে পারে এবং এটি আপনার প্রয়োজন এটি স্বাভাবিকভাবে ফিরে এসেছে কিনা তা পরীক্ষা করতে (0) বা নীরব ত্রুটি ঘটেছে। সংখ্যার রিটার্ন তাদের ইনপুটগুলির উপর ভিত্তি করে একটি প্রোগ্রাম থেকে অন্য প্রোগ্রামে 0..255 পাইপ দেওয়ার জন্য আরও দরকারী, অন্যথায় এটি সম্পর্কে ভাবার কোনও কারণ নেই: হয় 0 প্রত্যাবর্তন করুন বা একটি প্রম্পম্পাইল্ড মেইন ব্যবহার করুন যা কোনও শূন্য "init" কলকে দৃষ্টিভঙ্গি না করে অকেজো রিটার্ন দিয়ে আপনাকে বিরক্ত করুন।
দিমিত্রি

উত্তর:


150

EXIT_FAILURE, হয় কোনও রিটার্ন বিবৃতিতে mainবা তার পক্ষে যুক্তি হিসাবে exit(), কেবল সি বা সি ++ প্রোগ্রামে ব্যর্থতা নির্দেশ করার একমাত্র পোর্টেবল উপায়। exit(1)উদাহরণস্বরূপ, ভিএমএসে আসলে সফল সমাপ্তির ইঙ্গিত দিতে পারে।

EXIT_FAILUREআপনার প্রোগ্রামটি ব্যর্থ হওয়ার পরে যদি আপনি ব্যবহার করতে যাচ্ছেন , তবে EXIT_SUCCESSএটি সাফল্যের সাথে আপনি কেবল প্রতিসাম্যের প্রয়োজনে ব্যবহার করতে পারেন।

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

ব্যবহারের 0সামান্য সুবিধা রয়েছে যা আপনার #include <stdlib.h>সি বা #include <cstdlib>সি ++ এ প্রয়োজন নেই (যদি আপনি returnকল করার চেয়ে কোনও বিবৃতি ব্যবহার করেন exit()) - তবে কোনও উল্লেখযোগ্য আকারের একটি প্রোগ্রামের জন্য আপনি সরাসরি বা অপ্রত্যক্ষভাবে স্ট্যাডলিব অন্তর্ভুক্ত করতে চলেছেন যাহাই হউক না কেন।

এই ক্ষেত্রে, 1999 সালে স্ট্যান্ডার্ড দিয়ে শুরু করে এবং সি ++ এর সমস্ত সংস্করণে, প্রান্তে পৌঁছানো যাই হোক না কেন main()একটি অন্তর্নিহিত return 0;কাজ করে, তাই আপনাকে সম্ভবত 0বা EXIT_SUCCESSস্পষ্টভাবে ব্যবহার করার প্রয়োজন হবে না । (তবে কমপক্ষে সিতে, আমি একটি স্পষ্টিকে return 0;আরও ভাল স্টাইল হিসাবে বিবেচনা করি ))

(কারো OpenVMS সম্পর্কে জিজ্ঞাসা। আমি একটি দীর্ঘ সময় ব্যবহার করতে পারবেন না, কিন্তু আমি সাধারণত বোঝাতে সাফল্য বিজোড় অবস্থা মান প্রত্যাহার যখন এমনকি মান ব্যর্থতা বোঝান। সি বাস্তবায়ন মানচিত্র 0থেকে 1, যাতে return 0;সফল পরিসমাপ্তি নির্দেশ করে। অন্যান্য মানগুলি অপরিবর্তিত গৃহীত হয় , সুতরাং return 1;এটি সফল সমাপ্তির ইঙ্গিত EXIT_FAILUREদেয় a এর একটি শূন্য-সমমানের মানও হবে))


@ কিথথম্পসন আপনি কি ভিএমএসের (ওপেনভিএমএস?) সম্মানের সাথে আপনার উত্তরটি পরিষ্কার করতে পারতেন? এটি 0 এবং 1 এর সাথে EXIT_SUCCESS / EXIT_FAILURE এর সম্পর্ক পরিষ্কার নয় instead পরিবর্তে আমি বিজোড় / এমনকি মানগুলি ব্যাখ্যা করব।
ম্যালাত

@ ম্যালাত: আপনি কি আসলে ভিএমএস ব্যবহার করেন?
কিথ থম্পসন

না, কখনই ব্যবহার করিনি। আমি একটি ক্যানোনিকাল উত্তর খুঁজছিলাম, যেহেতু উইকিপিডিয়া একটি পৃথক শব্দের ব্যবহার করেছিল ।
ম্যালাত

1
@ রাইময়েড: এটি পসিক্স নয়, সি দ্বারা নির্দিষ্ট করা হয়েছে।
কিথ থম্পসন

1
@ ডিয়ানপি: 0এবং EXIT_SUCCESSএকই মান থাকার গ্যারান্টি নেই (আমি আমার উত্তরে উল্লেখ করেছি), তবে তারা উভয়ই সফল সমাপ্তি বোঝায়। আপনি যদি ব্যবহার করছেন তবেEXIT_SUCCESS স্টাইলিস্টিকভাবে আরও ভাল , তবে ঠিক আছে। EXIT_FAILUREexit(0)
কিথ থম্পসন

25

এটা কোনো ব্যপার না. দুটোই এক।

সি ++ স্ট্যান্ডার্ড উক্তি:

যদি স্থিতির মান শূন্য বা EXIT_SUCCESS হয়, তবে স্থিতি সফল সমাপ্তির একটি বাস্তবায়ন-সংজ্ঞায়িত ফর্মটি ফিরিয়ে দেওয়া হয়।


12
এটি সংকলকটির পক্ষে গুরুত্বপূর্ণ নয়, তবে এটি শৈলীর বিষয় হিসাবে বিবেচিত হতে পারে।
celtschk

2
@ এসলেটস্ক্ক: স্টাইলের বিষয়বস্তু উপলব্ধি ভিত্তিক ওরফে নন স্ট্যান্ডার্ডাইজড যাতে কোনও পার্থক্য হিসাবে গণনা করা হয় না You আপনি কেবল আপেলকে নাশপাতিগুলির সাথে অ্যাপল নয় অ্যাপলের সাথে তুলনা করতে পারেন।
অলোক

3
কোন গ্যারান্টি নেই EXIT_SUCCESS == 0। অন্যদিকে, এটি না হওয়ার কোনও ভাল কারণ নেই।
কিথ থমসন

@ কিথথম্পসন: EXIT_SUCCESS == ০. এর কোনও গ্যারান্টি নেই কেন? আরও স্পষ্টভাবে ব্যাখ্যা করুন।
ধ্বংসকারী

2
@ প্রবাসীমিট: একটি সিস্টেমে একাধিক মান থাকতে পারে যা সাফল্যকে নির্দেশ করে।
কিথ থম্পসন

11

0 হল সংজ্ঞা অনুসারে, একটি যাদু সংখ্যা। EXIT_SUCCESS প্রায় সর্বজনীনভাবে 0 এর সমান, আনন্দের সাথে যথেষ্ট। তাহলে কেন শুধু 0 / প্রস্থান করবেন না?

প্রস্থান (EXIT_SUCCESS); অর্থ প্রচুর পরিমাণে পরিষ্কার।

প্রস্থান (0); অন্যদিকে, কিছু উপায়ে প্রতিরোধী। শেল আচরণের সাথে পরিচিত না এমন কেউ হয়তো ধরে নিতে পারেন যে 0 == মিথ্যা == খারাপ, ঠিক যেমন সি এর 0 এর অন্যান্য ব্যবহারের মতো তবে না - এটি একটি বিশেষ ক্ষেত্রে, 0 == সাফল্য == ভাল। বেশিরভাগ অভিজ্ঞ দেবদের জন্য, কোনও সমস্যা হবেনা। তবে একেবারে বিনা কারণে নতুন লোকটির ট্রিপ আপ কেন?

tl; dr - যদি আপনার যাদু সংখ্যার জন্য একটি সংজ্ঞায়িত ধ্রুবক থাকে তবে ধ্রুবকটিকে প্রথম স্থানে না ব্যবহার করার কারণ প্রায়শই নেই। এটি আরও অনুসন্ধানযোগ্য, প্রায়শই পরিষ্কার করা ইত্যাদি etc. এবং এটি আপনার কোনও ব্যয় করে না।


আমি মনে করি যে 0 লোকেরা স্বয়ংক্রিয়ভাবে খারাপ হওয়ার প্রত্যাশা করছে সে সম্পর্কে আপনার মন্তব্যগুলি চিহ্ন ছাড়াই। অনেকগুলি এপিআই সাফল্যের জন্য 0 এবং ব্যর্থতার জন্য 0 ব্যবহার করে না এমনকি stdlib তেও ব্যবহার করে। যেমন stdlib ( fclose(), setvbuf(), ...), POSIX ( listen(), pthread_create(), pipe(), ...), এবং অনেক, অনেক অন্যান্য লাইব্রেরি (যেমন যেমন OpenGL [ glGetError()], zlib [ deflate()/ inflate()/ ...], এল-[ SDL_CreateWindowAndRenderer()/ ...], এবং আরো)।
টিম Čas

2
অবশ্যই, অন্যান্য উদাহরণ রয়েছে যেখানে 0 'সাফল্যের' জন্য ব্যবহৃত হয়, তবে এটি বিভ্রান্তিকর হওয়ার বিষয়ে তিনি সঠিক।
পল উইন্টজ

10

এটি একটি শেষ না হওয়া গল্প যা "সর্বোপরি আন্তঃব্যবহার্যতা এবং বহনযোগ্যতা" এর সীমাবদ্ধতা (একটি পৌরাণিক কাহিনী) প্রতিফলিত করে।

প্রোগ্রামটি "সাফল্য" নির্দেশ করতে কী ফিরিয়ে আনতে হবে তার দ্বারা সংজ্ঞা দেওয়া উচিত যে ভাষাটি কোনও স্পেসিফিকেশন দ্বারা নয় মানটি (অপারেটিং সিস্টেম বা প্রোগ্রামটি প্রক্রিয়াকৃত প্রক্রিয়াটি) গ্রহণ করছে।

তবে প্রোগ্রামাররা "পোর্টেবল উপায়ে" কোড লিখতে পছন্দ করেন এবং তাই প্রতীকী মানগুলি ফিরিয়ে দেওয়ার জন্য "অপারেটিং সিস্টেম" ধারণার জন্য তারা তাদের নিজস্ব মডেল আবিষ্কার করেন in

এখন, বহু-বহু-দৃশ্যে (যেখানে অনেক ভাষা অনেক সিস্টেমে প্রোগ্রাম লিখতে পরিবেশন করে) "সাফল্য" এবং অপারেটিং সিস্টেমের জন্য ভাষা সম্মেলন (যে কেউ সর্বদা একইরূপে দিতে পারে না) এর মধ্যে চিঠিপত্রের উচিত নির্দিষ্ট লক্ষ্য প্ল্যাটফর্মের জন্য একটি লাইব্রেরির নির্দিষ্ট প্রয়োগ দ্বারা পরিচালিত হবে।

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

এরপরে, এই জাতীয় চিঠিপত্র কীভাবে পরিচালনা করা উচিত সে সম্পর্কে কোনও স্পষ্ট মানদণ্ড তৈরি হয়নি। সি এবং সি ++ এর নিজস্ব "রিটার্ন মানগুলি" এর নিজস্ব সংজ্ঞা রয়েছে তবে কেউই সঠিক ওএস অনুবাদ দেয় না (বা আরও ভাল: কোনও সংকলক ডকুমেন্টেশন এ সম্পর্কে কিছু বলেনি)) 0 এর অর্থ সাফল্য যদি ইউনিক্স - লিনাক্স এবং -স্বাতন্ত্র্য কারণে উইন্ডোজের জন্য সত্য হয়, এবং এটি বিদ্যমান "ভোক্তা কম্পিউটারগুলির" 90% কভার করে, যা - বেশিরভাগ ক্ষেত্রেই - ফেরতের মানটিকে অবজ্ঞা করে (তাই আমরা পারি কয়েক দশক ধরে আলোচনা করুন, বু-র কারও নজরে আসবে না!)

এই দৃশ্যের অভ্যন্তরে, সিদ্ধান্ত নেওয়ার আগে এই প্রশ্নগুলি জিজ্ঞাসা করুন: - আমি আমার বিদ্যমান সম্পর্কে আমার কলকারীর সাথে কিছু কথা বলতে আগ্রহী? (আমি যদি সর্বদা 0 থেকে ফিরে যাই ... সমস্ত কিছুর পিছনে কোনও সূত্র নেই) - আমার যোগাযোগকারী এই যোগাযোগ সম্পর্কে কনভেনশন করছেন? (নোট করুন যে একটি একক মান কোনও কনভেনশন নয়: এটি কোনও তথ্য উপস্থাপনের অনুমতি দেয় না)

যদি এই উত্তর দুটিই না হয় তবে সম্ভবত ভাল সমাধানটি মূল রিটার্নের স্টেটমেন্টটি মোটেও লিখবেন না। (এবং লক্ষ্যটির ক্ষেত্রে শ্রোতার সাথে কাজ করার সিদ্ধান্ত নিচ্ছে)

কোনও কনভেনশন না থাকলে 0 = সাফল্য বেশিরভাগ পরিস্থিতিতে পূরণ করে (এবং প্রতীকগুলি ব্যবহার করা সমস্যাযুক্ত হতে পারে, যদি তারা কোনও সম্মেলন প্রবর্তন করে)।

যদি কনভেনশনগুলি স্থানে থাকে তবে তাদের সাথে সামঞ্জস্যপূর্ণ প্রতীকী ধ্রুবকগুলি ব্যবহার করার বিষয়টি নিশ্চিত করুন (এবং প্ল্যাটফর্মগুলির মধ্যে কনভেনশন সুসংগততা, মান সংহতি নয়, নিশ্চিত করুন)।


4

একবার আপনি কোড লিখতে শুরু করেন যা প্রস্থান স্থিতির এক অগণিত ফিরিয়ে #defineআনতে পারে , আপনি তাদের সমস্তটি শুরু করতে শুরু করেন। এই ক্ষেত্রে EXIT_SUCCESS" ম্যাজিক নম্বর " না হওয়ার প্রসঙ্গে অর্থবোধ করে । এটি আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে কারণ প্রতিটি অন্যান্য প্রস্থান কোড হবে EXIT_SOMETHING। যদি আপনি কেবল এমন কোনও প্রোগ্রাম লিখেন যা হয়ে গেলে ফিরে আসবে, return 0কার্যকর হবে, এবং সম্ভবত এমনকি ক্লিনার কারণ এটি প্রস্তাবিত যে কোনও অত্যাধুনিক রিটার্ন কোড কাঠামো নেই।


0

আপনি কোন প্রোগ্রাম থেকে ফিরে যাবেন তা কেবল একটি সম্মেলন।

না, আমি "EXIT_SUCCESS" "0" না হয় এমন কোনও পরিস্থিতিতে ভাবতে পারি না ।

ব্যক্তিগতভাবে, আমি "0" সুপারিশ করব।

এই প্রোগ্রামটিতে ...


1
আমি 10 বছর ধরে সি ++ প্রোগ্রামিং করে চলেছি এবং এখনও মনে করতে পারছি না যে 0 এর অর্থ রিটার্ন মানগুলির ক্ষেত্রে সাফল্য বা ব্যর্থতা।
lajjaton_j

@ আলাহাটন_জ আমি বুঝতে পারি এটি মনে হয় কারণ এটি স্বজ্ঞাত পাল্টা: 0মিথ্যা এবং অনেক ফাংশন 0ব্যর্থতা / কিছুই না করে ফিরে আসে ।
অর্থ-বিষয়গুলি

-4

আপনি যদি EXIT_SUCCESS ব্যবহার করেন তবে আপনার কোডটি আরও পোর্টেবল হবে।

http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/


5
আমি অত্যন্ত সন্দেহ করি যে এটি আপনার কোডটিকে আরও বা কোনও কম পোর্টেবল করে তোলে।
বেনজামিন লিন্ডলি

9
না, তা হবে না। মান গ্যারান্টি দেয় যে 0 এবং EXIT_SUCCESSউভয়ই সফল সমাপ্তি নির্দেশ করে।
কিথ থম্পসন

-5

কিছু সংকলক এটি দিয়ে সমস্যা তৈরি করতে পারে - একটি ম্যাক সি ++ সংকলকটিতে, এক্সআইআইএসএসসিসিএস আমার পক্ষে ভাল কাজ করেছে তবে লিনাক্স সি ++ কমপ্লায়ারকে এক্সআইএসআইএসএস কি তা জানতে এটির জন্য আমাকে সিএসটিডলিব যুক্ত করতে হয়েছিল। তা ছাড়া তারা এক এবং অভিন্ন the


আমি একটি ম্যাকের জন্য বোঝাচ্ছি EXIT_SUCCESS cstdlib অন্তর্ভুক্ত না করেই কাজ করেছে।
পরিসংখ্যান

4
যদি EXIT_SUCCESSহয় <stdlib.h>বা না অন্তর্ভুক্ত কাজ করা হয় <cstdlib>, অন্য কোনও হেডার অবশ্যই এটি প্রত্যক্ষ বা অপ্রত্যক্ষভাবে সংজ্ঞায়িত করেছেন। সি ++ এ, স্ট্যান্ডার্ড শিরোনামের জন্য #includeঅন্যান্য স্ট্যান্ডার্ড শিরোনামের পক্ষে সাধারণ । যদি এটি ত্রুটি ছাড়াই সংকলন করে: int main() { return EXIT_SUCCESS; }তবে আপনার সংকলক সম্ভবত বগি।
কিথ থমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.