Liệu exit () có làm gì đặc biệt mà 'return' không?
Với một số trình biên dịch cho các nền tảng không phổ biến, exit()
có thể dịch đối số của nó thành giá trị thoát của chương trình trong khi lợi nhuận từ main()
có thể chuyển trực tiếp giá trị sang môi trường máy chủ mà không cần dịch.
Tiêu chuẩn yêu cầu hành vi giống hệt nhau trong những trường hợp này (cụ thể, nó nói rằng việc trả lại một cái gì đó int
tương thích từ main()
đó sẽ tương đương với việc gọi exit()
với giá trị đó). Vấn đề là các hệ điều hành khác nhau có các quy ước khác nhau để diễn giải các giá trị thoát. Trên nhiều hệ thống (NHIỀU!), 0 có nghĩa là thành công và bất cứ điều gì khác là thất bại. Nhưng trên, nói, VMS, giá trị lẻ có nghĩa là thành công và thậm chí những giá trị có nghĩa là thất bại. Nếu bạn trả về 0 từ main()
, người dùng VMS sẽ thấy một thông báo khó chịu về vi phạm quyền truy cập. Thực tế không có vi phạm truy cập - đó đơn giản là thông báo tiêu chuẩn liên quan đến mã lỗi 0.
Sau đó, ANSI xuất hiện và ban phước EXIT_SUCCESS
và EXIT_FAILURE
như những lý lẽ bạn có thể vượt qua exit()
. Tiêu chuẩn này cũng nói rằng exit(0)
nên cư xử y hệt exit(EXIT_SUCCESS)
, vì vậy hầu hết các trường xác định EXIT_SUCCESS
để 0
.
Do đó, tiêu chuẩn đặt bạn vào một liên kết trên VMS, vì nó không có cách tiêu chuẩn nào để trả về mã lỗi xảy ra có giá trị 0.
Do đó, trình biên dịch VAX / VMS C thời kỳ đầu những năm 1990 không giải thích giá trị trả về từ main()
đó, nó chỉ đơn giản trả về bất kỳ giá trị nào cho môi trường máy chủ. Nhưng nếu bạn đã sử dụng exit()
nó sẽ làm những gì tiêu chuẩn yêu cầu: dịch EXIT_SUCCESS
(hoặc 0
) thành mã thành công và EXIT_FAILURE
thành mã lỗi chung. Để sử dụng EXIT_SUCCESS
, bạn phải chuyển nó đến exit()
, bạn không thể trả lại từ đó main()
. Tôi không biết liệu các phiên bản hiện đại hơn của trình biên dịch đó có duy trì hành vi đó hay không.
Một chương trình C di động được sử dụng để trông như thế này:
#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 */
}
Ngoài ra: Nếu tôi nhớ lại một cách chính xác, quy ước VMS cho các giá trị thoát có nhiều sắc thái hơn lẻ / chẵn. Nó thực sự sử dụng một cái gì đó như ba bit thấp để mã hóa mức độ nghiêm trọng. Tuy nhiên, nói chung, mức độ nghiêm trọng kỳ lạ chỉ ra thông tin thành công hoặc thông tin linh tinh và các mức chẵn chỉ ra lỗi.