return n
( main
İşlevde) ve exit(n)
C arasında herhangi bir fark var mı ? C veya POSIX standartlarına göre mi tanımlanmış yoksa OS veya derleyiciye mi bağlı?
return n
( main
İşlevde) ve exit(n)
C arasında herhangi bir fark var mı ? C veya POSIX standartlarına göre mi tanımlanmış yoksa OS veya derleyiciye mi bağlı?
Yanıtlar:
Çoğu durumda, hiçbir fark yoktur, ancak burada return 0;
veya kullanmasına bağlı olarak farklı davranacak bir C programı vardır exit(0);
:
#include <stdio.h>
#include <stdlib.h>
static char *message;
void cleanup(void) {
printf("message = \"%s\"\n", message);
}
int main(void) {
char local_message[] = "hello, world";
message = local_message;
atexit(cleanup);
#ifdef USE_EXIT
puts("exit(0);");
exit(0);
#else
puts("return 0;");
return 0;
#endif
}
Çünkü atexit()
çağrısı ya exit(0);
ya return 0;
nedenler cleanup
işlev çağrılacak. Aradaki fark, program çağırırsa exit(0);
, temizleme "çağrısı" main()
hala etkinken local_message
nesnenin hala var olması durumunda temizleme gerçekleşir . return 0;
Ancak, yürütme derhal çağrıyı sonlandırır main()
ve sonracleanup()
işlevi çağırır . Yana cleanup()
(global ile ifade eder message
yerel olarak ayrılacak bir nesneye işaretçi) main
ve bu nesne artık yok, davranış tanımlanmamış.
İşte benim sistemde gördüğüm davranış:
$ gcc -DUSE_EXIT c.c -o c && ./c
exit(0);
message = "hello, world"
$ gcc c.c -o c && ./c
return 0;
message = ""
$
Programı olmadan çalıştırmak, -DUSE_EXIT
çökme veya yazdırma da dahil olmak üzere herhangi bir şey yapabilirdi "hello, world"
(kullanılan bellek local_message
tıkanmazsa).
Bununla birlikte, pratikte, bu fark sadece içinde yerel olarak tanımlanan nesnelerin işaretçiler kaydedilerek main()
dışarıda görünür main()
kılınması durumunda ortaya çıkar. Bu makul bir şekilde gerçekleşebilir argv
. (Nesneler tarafından işaret benim sistem şovlarda Deney argv
ve tarafından *argv
döndükten sonra var olmaya devam main()
, ama bunun bağımlı olmamalıdır.)
C için
Standart ilk çağrıdan ana dönüşün çağrı çıkışına eşdeğer olduğunu söylüyor. Ancak, temizleme sırasında yerelden ana verilere ihtiyaç duyulabiliyorsa ana bir dönüşün çalışması beklenemez.
C ++ için
Çıkış (0) programdan çıkmak için kullanıldığında, yerel olarak kapsam dışı statik olmayan nesneler için yıkıcılar çağrılmaz. Ancak 0 dönüşü kullanılırsa yıkıcılar çağrılır.
Program 1 - - çıkmak için exit (0) kullanır
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
getchar();
}
};
int main() {
Test t1;
// using exit(0) to exit from main
exit(0);
}
Çıktı: İç Testin Yapıcısı
Program 2 - Çıkmak için 0 dönüşünü kullanır
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
}
};
int main() {
Test t1;
// using return 0 to exit from main
return 0;
}
Çıktı: İç Test Yapıcısı
İç Test Yıkıcısı
Yıkıcıları çağırmak bazen önemlidir, örneğin yıkıcı dosyaları kapatma gibi kaynakları serbest bırakmak için kod içeriyorsa.
Exit () çağrsak bile statik nesnelerin temizleneceğini unutmayın. Örneğin, aşağıdaki programa bakın.
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Test {
public:
Test() {
printf("Inside Test's Constructor\n");
}
~Test(){
printf("Inside Test's Destructor");
getchar();
}
};
int main() {
static Test t1; // Note that t1 is static
exit(0);
}
Çıktı: İç Test Yapıcısı
İç Test Yıkıcısı
finally
C standardının (C99) iki tür yürütme ortamı tanımladığını belirtmek gerekir: Bağımsız Ortam ve Barındırılan Ortam . Bağımsız ortam, C kitaplıklarını desteklemeyen ve gömülü uygulamalar ve benzerleri için tasarlanmış bir C ortamıdır. C kitaplıklarını destekleyen AC ortamına Barındırılan ortam denir.
C99, Bağımsız bir ortamda programın sonlandırılmasının tanımlandığını belirtir. Yani, uygulama tanımlarsa main
, return n
ve exit
onların davranışları olarak bu uygulamada tanımlanır edilir.
C99, Barındırılan ortam davranışını,
Ana işlevin dönüş türü onunla uyumlu bir türse, ilk çağrıdan ana işleve dönüş, ana işlev tarafından argüman olarak döndürülen değerle çıkış işlevini çağırmaya eşdeğerdir; ana işlevi sonlandıran} değerine ulaşıldığında 0 değeri döndürülür. Dönüş türü int ile uyumlu değilse, ana makine ortamına döndürülen sonlandırma durumu belirtilmez.
C standardının bakış açısından, return
bir ifade exit()
olmak ve bir işlev olmaktan başka, gerçekten değil . Her ikisi de kayıtlı tüm işlevlerin atexit()
çağrılmasına ve ardından programın sonlandırılmasına neden olur .
Dikkat etmeniz gereken birkaç durum vardır:
main()
. Uygulamada nadiren görülmesine rağmen, C'de yasaldır (C ++ açıkça yasaklar.)main()
. Bazen var olan main()
başka bir şey olarak yeniden adlandırılır ve yeni bir adla adlandırılır main()
.Kullanımı exit()
kodu yazdık sonra bunlardan biri olursa anormal olarak sona değil, özellikle eğer bir hata tanıtacak. Bundan kaçınmak için, main()
işlevi olduğu gibi davranma ve return
bitmesini istediğinizde kullanma alışkanlığı içinde olmak iyi bir fikirdir .