Exit () 'return' özel bir şeyi yapar mı?
Yaygın olmayan platformlar için bazı derleyicilerle exit()
, argümanını programınızın çıkış değerine çevirebilirken, bir dönüş main()
, değeri herhangi bir çeviri olmadan doğrudan ana bilgisayar ortamına geçirebilir.
Standart, bu durumlarda aynı davranışı gerektirir (özellikle, int
uyumlu olan bir şeyin döndürülmesinin, bu değerle main()
çağırmaya eşdeğer olması gerektiğini söyler exit()
). Sorun, farklı işletim sistemlerinin çıkış değerlerini yorumlamak için farklı kuralları olmasıdır. Birçok (MANY!) Sistemde 0, başarı anlamına gelir ve başka bir şey başarısızlık demektir. Ancak, örneğin, VMS, tek değerler başarı anlamına gelir ve hatta başarısızlık anlamına gelir. Eğer 0 main()
değerini döndürdüyseniz , VMS kullanıcısı erişim ihlaliyle ilgili kötü bir mesaj görür. Aslında bir erişim ihlali yoktu - bu sadece hata kodu 0 ile ilişkili standart mesajdı.
Sonra ANSI ortaya çıktı ve kutsanmış EXIT_SUCCESS
ve EXIT_FAILURE
geçebileceğiniz argümanlar olarak exit()
. Standart ayrıca söylüyor exit(0)
özdeş için davranması gerektiği exit(EXIT_SUCCESS)
bu yüzden çoğu uygulamaları tanımlamak, EXIT_SUCCESS
için 0
.
Bu nedenle, standart, 0 değerine sahip bir hata kodunu döndürmek için standart bir yol bırakmadığından, sizi VMS'ye bağlar .
1990'lı yılların başındaki VAX / VMS C derleyicisi bu nedenle dönüş değerini yorumlamadı, main()
sadece ana bilgisayar ortamına herhangi bir değer döndürdü. Ancak bunu kullandıysanız exit()
, standardın gerektirdiği şeyi yapardı: EXIT_SUCCESS
(veya 0
) bir başarı koduna ve EXIT_FAILURE
genel bir hata koduna çevirin (veya ) . Kullanım için EXIT_SUCCESS
, sen vardı onu geçmek exit()
, içinden geri olamazdı main()
. Derleyicinin daha modern sürümlerinin bu davranışı koruyup korumadığını bilmiyorum.
Taşınabilir C programı şu şekilde görünüyordu:
#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 */
}
Bir kenara: Doğru hatırlıyorsam, çıkış değerleri için VMS kuralı tek / çiftten daha inceliklidir. Aslında bir önem seviyesini kodlamak için düşük üç bit gibi bir şey kullanır. Bununla birlikte, genel olarak konuşmak gerekirse, garip şiddet seviyeleri başarı ya da çeşitli bilgileri, hatta çiftler hataları gösterdi.