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_SUCCESS0
ดังนั้นมาตรฐานทำให้คุณผูกกับ 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 สำหรับค่าทางออกนั้นมีความเหมาะสมมากกว่าคี่ / คู่ จริง ๆ แล้วมันใช้บางอย่างเช่นบิตต่ำสามบิตเพื่อเข้ารหัสระดับความรุนแรง อย่างไรก็ตามโดยทั่วไปการพูดระดับความรุนแรงคี่บ่งชี้ความสำเร็จหรือข้อมูลเบ็ดเตล็ด