Ini pertanyaan sederhana, tetapi saya terus melihat jawaban yang bertentangan: haruskah rutinitas utama program C ++ kembali 0
atau EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
atau
int main(){return 0;}
Apakah mereka sama persis? Haruskah EXIT_SUCCESS
hanya digunakan dengan exit()
?
Saya pikir EXIT_SUCCESS
akan menjadi pilihan yang lebih baik karena perangkat lunak lain mungkin ingin menganggap nol sebagai kegagalan, tetapi saya juga mendengar bahwa jika Anda kembali 0
, kompiler dapat mengubahnya ke nilai yang berbeda.
c++
c
return-value
main
Trevor Hickey
sumber
sumber
0
danEXIT_SUCCESS
keduanya ditafsirkan sebagai kesuksesan.Jawaban:
EXIT_FAILURE
, baik dalam pernyataan returnmain
atau sebagai argumenexit()
, adalah satu-satunya cara portabel untuk menunjukkan kegagalan dalam program C atau C ++.exit(1)
sebenarnya dapat menandakan penghentian yang berhasil di VMS, misalnya.Jika Anda akan menggunakan
EXIT_FAILURE
saat program Anda gagal, Anda sebaiknya menggunakannyaEXIT_SUCCESS
saat berhasil, hanya demi kesimetrisan.Di sisi lain, jika program tidak pernah memberi sinyal kegagalan, Anda dapat menggunakan salah satu
0
atauEXIT_SUCCESS
. Keduanya dijamin oleh standar untuk menandakan penyelesaian berhasil. (Hampir tidak mungkin yangEXIT_SUCCESS
dapat memiliki nilai selain 0, tetapi nilainya sama dengan 0 pada setiap implementasi yang pernah saya dengar.)Menggunakan
0
memiliki keuntungan kecil yang tidak Anda perlukan#include <stdlib.h>
di C, atau#include <cstdlib>
di C ++ (jika Anda menggunakanreturn
pernyataan daripada meneleponexit()
) - tetapi untuk program dengan ukuran signifikan apa pun Anda akan menyertakan stdlib secara langsung atau tidak langsung bagaimanapun.Dalam hal ini, di C yang dimulai dengan standar 1999, dan di semua versi C ++, mencapai akhir
main()
tetap melakukan implisitreturn 0;
, jadi Anda mungkin tidak perlu menggunakan salah satunya0
atauEXIT_SUCCESS
secara eksplisit. (Tapi setidaknya di C, saya menganggap gaya eksplisitreturn 0;
sebagai gaya yang lebih baik.)(Seseorang bertanya tentang OpenVMS. Saya sudah lama tidak menggunakannya, tetapi seingat saya, nilai status ganjil umumnya menunjukkan keberhasilan sedangkan nilai genap menunjukkan kegagalan. Implementasi C memetakan
0
ke1
, sehinggareturn 0;
menunjukkan penghentian yang berhasil. Nilai-nilai lain diteruskan tanpa perubahan , begitureturn 1;
juga menunjukkan penghentian yang berhasil.EXIT_FAILURE
akan memiliki nilai genap bukan nol.)sumber
0
danEXIT_SUCCESS
tidak dijamin memiliki nilai yang sama (saya sebutkan dalam jawaban saya), tetapi keduanya menunjukkan penghentian yang berhasil.EXIT_SUCCESS
secara gaya lebih baik jika Anda juga menggunakanEXIT_FAILURE
, tetapiexit(0)
tidak masalah.Tidak masalah. Keduanya sama.
Kutipan Standar C ++:
sumber
EXIT_SUCCESS == 0
. Di sisi lain, tidak ada alasan bagus untuk tidak melakukannya.0, menurut definisi, adalah angka ajaib. EXIT_SUCCESS hampir secara universal sama dengan 0, cukup bahagia. Jadi mengapa tidak kembali / keluar 0?
keluar (EXIT_SUCCESS); sangat jelas artinya.
keluar (0); di sisi lain, berlawanan dengan intuisi dalam beberapa hal. Seseorang yang tidak terbiasa dengan perilaku shell mungkin berasumsi bahwa 0 == false == buruk, sama seperti penggunaan 0 lainnya di C. Tetapi tidak - dalam kasus khusus ini, 0 == sukses == baik. Untuk developer yang paling berpengalaman, tidak akan menjadi masalah. Tapi mengapa tersandung orang baru tanpa alasan sama sekali?
tl; dr - jika ada konstanta yang ditentukan untuk bilangan ajaib Anda, hampir tidak pernah ada alasan untuk tidak menggunakan konstanta di tempat pertama. Ini lebih mudah dicari, sering kali lebih jelas, dll. Dan tidak dikenakan biaya apa pun.
sumber
fclose()
,setvbuf()
, ...), POSIX (listen()
,pthread_create()
,pipe()
, ...), dan banyak, banyak perpustakaan lainnya (misalnya OpenGL [glGetError()
], zlib [deflate()
/inflate()
/ ...], SDL [SDL_CreateWindowAndRenderer()
/ ...], dan lebih).Ini adalah cerita yang tidak pernah berakhir yang mencerminkan batasan (mitos) dari "interoperabilitas dan portabilitas di atas segalanya".
Apa yang program harus kembalikan untuk menunjukkan "sukses" harus ditentukan oleh siapa yang menerima nilai (sistem operasi, atau proses yang memanggil program) bukan oleh spesifikasi bahasa.
Tetapi programmer suka menulis kode dengan "cara portabel" dan karenanya mereka menciptakan model mereka sendiri untuk konsep "sistem operasi" yang mendefinisikan nilai-nilai simbolik untuk dikembalikan.
Sekarang, dalam skenario banyak-ke-banyak (di mana banyak bahasa berfungsi untuk menulis program ke banyak sistem), korespondensi antara konvensi bahasa untuk "berhasil" dan sistem operasi (yang tidak dapat diberikan oleh siapa pun untuk selalu sama) harus ditangani oleh implementasi khusus perpustakaan untuk platform target tertentu.
Tapi - sayangnya - konsep ini tidak begitu jelas pada saat bahasa C digunakan (terutama untuk menulis kernel UNIX), dan Gigagram buku yang ditulis dengan mengatakan "return 0 berarti sukses", karena itu benar pada OS di saat itu memiliki kompiler C.
Sejak saat itu, tidak pernah dibuat standarisasi yang jelas tentang bagaimana korespondensi tersebut harus ditangani. C dan C ++ memiliki definisi mereka sendiri tentang "nilai yang dikembalikan" tetapi tidak ada yang memberikan terjemahan OS yang tepat (atau lebih baik: tidak ada dokumentasi kompilator yang mengatakan apa pun tentangnya). 0 berarti sukses jika benar untuk UNIX - LINUX dan -untuk alasan independen- untuk Windows juga, dan ini mencakup 90% dari "komputer konsumen" yang ada, yang - dalam sebagian besar kasus - mengabaikan nilai yang dikembalikan (sehingga kami dapat diskusikan selama beberapa dekade, tapi tidak ada yang akan memperhatikan!)
Di dalam skenario ini, sebelum mengambil keputusan, tanyakan pertanyaan berikut: - Apakah saya tertarik untuk mengkomunikasikan sesuatu kepada penelepon tentang keberadaan saya? (Jika saya selalu mengembalikan 0 ... tidak ada petunjuk di balik semuanya) - Apakah penelepon saya memiliki kesepakatan tentang komunikasi ini? (Perhatikan bahwa satu nilai bukanlah konvensi: yang tidak mengizinkan representasi informasi apa pun)
Jika kedua jawaban ini tidak, mungkin solusi yang baik adalah tidak menulis pernyataan pengembalian utama sama sekali. (Dan biarkan kompilator untuk memutuskan, sehubungan dengan target bekerja).
Jika tidak ada konvensi di tempat, 0 = sukses memenuhi sebagian besar situasi (dan menggunakan simbol mungkin bermasalah, jika mereka memperkenalkan konvensi).
Jika ada konvensi, pastikan untuk menggunakan konstanta simbolik yang koheren dengannya (dan pastikan koherensi konvensi, bukan koherensi nilai, antar platform).
sumber
Begitu Anda mulai menulis kode yang dapat mengembalikan banyak sekali status keluar, Anda mulai
#define
semuanya. Dalam hal iniEXIT_SUCCESS
masuk akal dalam konteks bukan menjadi " angka ajaib ". Ini membuat kode Anda lebih mudah dibaca karena setiap kode keluar lainnya akan menjadiEXIT_SOMETHING
. Jika Anda hanya menulis program yang akan dikembalikan setelah selesai,return 0
valid, dan mungkin lebih bersih karena menunjukkan bahwa tidak ada struktur kode pengembalian yang canggih.sumber
Apa yang Anda kembalikan dari program hanyalah konvensi.
Tidak, saya tidak bisa memikirkan situasi apa pun di mana "EXIT_SUCCESS" bukan "0".
Secara pribadi, saya akan merekomendasikan "0".
MENURUT OPINI SAYA...
sumber
0
salah, dan banyak fungsi kembali0
gagal / tidak melakukan apa-apa.Jika Anda menggunakan EXIT_SUCCESS, kode Anda akan lebih portabel.
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
sumber
EXIT_SUCCESS
keduanya menunjukkan penghentian yang berhasil.Beberapa kompiler mungkin membuat masalah dengan ini - pada kompiler Mac C ++, EXIT_SUCCESS bekerja dengan baik untuk saya, tetapi pada kompiler Linux C ++ saya harus menambahkan cstdlib untuk mengetahui apa itu EXIT_SUCCESS. Selain itu, mereka adalah satu dan sama.
sumber
EXIT_SUCCESS
bekerja tanpa menyertakan salah satu<stdlib.h>
atau<cstdlib>
, beberapa header lain harus telah menentukannya, secara langsung atau tidak langsung. Di C ++, header#include
standar sama dengan header standar lainnya. Jika ini terkompilasi tanpa kesalahan:int main() { return EXIT_SUCCESS; }
maka kompiler Anda mungkin bermasalah.