exit () ทำสิ่งใดเป็นพิเศษหรือไม่ที่ "คืน" ไม่ได้?
สำหรับคอมไพเลอร์บางตัวสำหรับแพลตฟอร์มที่ไม่ธรรมดาexit()
อาจแปลอาร์กิวเมนต์เป็นค่าการออกของโปรแกรมของคุณในขณะที่การส่งคืนจากmain()
อาจส่งผ่านค่าโดยตรงไปยังสภาพแวดล้อมโฮสต์โดยไม่มีการแปลใด ๆ
มาตรฐานจำเป็นต้องมีพฤติกรรมที่เหมือนกันในกรณีเหล่านี้ (โดยเฉพาะมันบอกว่าคืนสิ่งที่int
เข้ากันได้จากmain()
ควรจะเทียบเท่ากับการโทรexit()
ด้วยค่านั้น) ปัญหาคือระบบปฏิบัติการที่แตกต่างกันมีข้อกำหนดที่แตกต่างกันสำหรับการตีความค่าออก ในหลาย ๆ ระบบ (MANY!) 0 หมายถึงความสำเร็จและสิ่งอื่นใดคือความล้มเหลว แต่ในการพูด VMS ค่าแปลกหมายถึงความสำเร็จและแม้กระทั่งคนหมายถึงความล้มเหลว หากคุณคืนค่า 0 จากmain()
ผู้ใช้ VMS จะเห็นข้อความที่น่ารังเกียจเกี่ยวกับการละเมิดการเข้าถึง ไม่มีการละเมิดการเข้าถึง - นั่นเป็นเพียงข้อความมาตรฐานที่เกี่ยวข้องกับรหัสความล้มเหลว 0
จากนั้น ANSI ก็เข้ามาและอวยพรEXIT_SUCCESS
และEXIT_FAILURE
เป็นข้อโต้แย้งที่คุณสามารถส่งผ่านไปexit()
ได้ มาตรฐานก็บอกว่าexit(0)
ควรประพฤติเหมือนกันexit(EXIT_SUCCESS)
ดังนั้นการใช้งานส่วนใหญ่กำหนดไปEXIT_SUCCESS
0
ดังนั้นมาตรฐานทำให้คุณผูกกับ VMS เนื่องจากไม่มีวิธีมาตรฐานในการส่งคืนรหัสความล้มเหลวที่เกิดขึ้นเพื่อให้มีค่า 0
คอมไพเลอร์ในช่วงต้นทศวรรษที่ 1990 VAX / VMS C จึงไม่ได้ตีความค่าตอบแทนจากการmain()
คืนค่า แต่ถ้าคุณใช้exit()
มันจะทำสิ่งที่มาตรฐานที่ต้องการ: แปลEXIT_SUCCESS
(หรือ0
) ลงในรหัสที่ประสบความสำเร็จและEXIT_FAILURE
เป็นรหัสความล้มเหลวทั่วไป กับการใช้งานEXIT_SUCCESS
คุณมีที่จะผ่านมันไปคุณจะไม่สามารถกลับมาได้จากexit()
main()
ฉันไม่ทราบว่าคอมไพเลอร์รุ่นที่ทันสมัยกว่านี้รักษาพฤติกรรมนั้นไว้หรือไม่
โปรแกรม C พกพาที่ใช้ในลักษณะนี้:
#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 */
}
นอกเหนือ: ถ้าฉันจำได้อย่างถูกต้องอนุสัญญา VMS สำหรับค่าทางออกนั้นมีความเหมาะสมมากกว่าคี่ / คู่ จริง ๆ แล้วมันใช้บางอย่างเช่นบิตต่ำสามบิตเพื่อเข้ารหัสระดับความรุนแรง อย่างไรก็ตามโดยทั่วไปการพูดระดับความรุนแรงคี่บ่งชี้ความสำเร็จหรือข้อมูลเบ็ดเตล็ด