Apakah exit () melakukan sesuatu yang istimewa yang 'kembali' tidak?
Dengan beberapa kompiler untuk platform yang tidak umum, exit()
mungkin menerjemahkan argumennya ke nilai keluar program Anda sementara pengembalian dari main()
mungkin hanya meneruskan nilai langsung ke lingkungan host tanpa terjemahan apa pun.
Standar ini memerlukan perilaku yang identik dalam kasus ini (khususnya, ia mengatakan mengembalikan sesuatu yang int
-compatible dari main()
harus setara dengan memanggil exit()
dengan nilai itu). Masalahnya adalah bahwa OS yang berbeda memiliki konvensi yang berbeda untuk menafsirkan nilai keluar. Pada banyak sistem (BANYAK!), 0 berarti sukses dan yang lainnya gagal. Tetapi pada, katakanlah, VMS, nilai ganjil berarti kesuksesan dan bahkan yang berarti kegagalan. Jika Anda kembali 0 dari main()
, pengguna VMS akan melihat pesan buruk tentang pelanggaran akses. Sebenarnya tidak ada pelanggaran akses - itu hanya pesan standar yang terkait dengan kode kegagalan 0.
Kemudian ANSI datang dan memberkati EXIT_SUCCESS
dan EXIT_FAILURE
sebagai argumen Anda bisa lolos exit()
. Standar ini juga mengatakan bahwa exit(0)
harus bersikap identik dengan exit(EXIT_SUCCESS)
, sehingga sebagian besar implementasi mendefinisikan EXIT_SUCCESS
untuk 0
.
Standar, oleh karena itu, membuat Anda terikat pada VMS, karena tidak meninggalkan cara standar untuk mengembalikan kode kegagalan yang kebetulan memiliki nilai 0.
Oleh karena itu, kompiler VAX / VMS C awal 1990-an tidak menafsirkan nilai balik dari main()
, ia hanya mengembalikan nilai apa pun ke lingkungan host. Tetapi jika Anda menggunakannya exit()
akan melakukan apa yang diperlukan standar: menerjemahkan EXIT_SUCCESS
(atau 0
) menjadi kode sukses dan EXIT_FAILURE
menjadi kode kegagalan umum. Untuk menggunakannya EXIT_SUCCESS
, Anda harus meneruskannya exit()
, Anda tidak dapat mengembalikannya main()
. Saya tidak tahu apakah versi yang lebih modern dari kompiler itu mempertahankan perilaku itu.
Program C portabel digunakan untuk terlihat seperti ini:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
Selain itu: Jika saya mengingat dengan benar, konvensi VMS untuk nilai keluar lebih bernuansa daripada ganjil / genap. Ini sebenarnya menggunakan sesuatu seperti tiga bit rendah untuk mengkodekan tingkat keparahan. Secara umum, tingkat keparahan ganjil mengindikasikan keberhasilan atau informasi lain-lain dan bahkan genap mengindikasikan kesalahan.