2010-10-08 18 views

cevap

5

işlev herhangi bir değer döndürmez. - ve OS Bu durumda dönüş başarıda

OS -> D runtime -> main 

ana işlevi ana işlevi hiçbir şey döndüren tanınan Ge çalışma zamanı sistemi tarafından çağrılır: Çağrı yığını şöyle göz önüne aldığımızda mantıksız bir şey yoktur. Ana işlev dönüş tipi int ile tanımlanmışsa, D çalışma zamanı ana işlev tarafından döndürülen OS değerine döner. Alexandrescu söylediğini Ne

+0

@Michal Cevabını kabul ettim çünkü en net olanı. Ama sanırım eğer ana boşluk ile karşılaşırsanız, birisi bir şey döndürdüğünü söylerse en iyi kafa karıştırıcı olur. Bence D bölümünde en iyi seçim değil. –

+2

Bu biraz yanıltıcıdır, ancak "ana" işletim sistemine bir değer döndürmekten daha fazlası değildir. Çoğu dil için bu belgelerin çoğu, bu terimlerle ifade edilen durumdur :) Her zaman 1) OS'ye özgü etkileşimleri ele alır ve 2) dil anlamını zorunlu kılar. – shambulator

+0

@shambulator, ancak ana (C++) tarafından döndürülen değer, sisteme döndürülen değerdir, bu yüzden benim için "bir dil kullanıcısı" söz konusu olduğunda, diğer katmanların orada olacağı gerçekten önemli değil - Ben açıkça belirtiyorum Son noktadan kontrolün (ana) olduğu programım, ana dönüşlerin ne olduğunu ve bir dönüş türü olarak geçersiz kaldığını ve “örtülü bir şekilde” bir şey döndürdüğünü geri döndürüyorsa bu sadece kötü bir fikir. Yine de benim için. Ve işletim sisteminin ana geri dönüş değerinin doğru olmadığını söylediğinizde, bir ana ilk nokta (ya da son) nasıl göründüğünüze bağlı olduğu için bu doğru değildir. - –

1

Eğer işlevinden dönmek ne olacak

echo $? 

kullanarak (bash) alabilirsiniz

int main(...); 

olarak işlevini daha sonra dönüş değeri, tanımlarsanız. Bir şey dönmüyor veya

void main(...); 

olarak main fonksiyonunu tanımlamak o zaman komutun çıkış durumu tanımlanmamıştır. Bazı sebeplerden dolayı (bu konuda herhangi bir belge bulamıyorum) sistemimde her zaman 200 var.

+0

@Delan ama işlev dönüş olarak boşluğa ile tanımlanması durumunda bile değil 200 Bununla var sorun geçersiz olarak olsa bile, yani bir şey dönmemesi yazın bir geri dönüş türü bu işlev her zaman bir şey döndürür ve bu bana mantıksızdır, benimle aynı fikirde misiniz? –

+2

"void main" işlevini kullanırsanız * işlevi * hiçbir şey döndürmez. 'Ana 'döndüğünde, * D çalışma zamanı desteği * hangi sistemden olursa olsun, işletim sistemine bir işlem çıkış kodu verir. 'Int main' kullanırsanız, döndürdüğünüz değer OS'ye geri döndürülür. İşletim sistemi hangi dili kullandığınızı bilmiyor veya önemsemiyor; bir çıkış kodunun varlığı buna bağlı değildir. – shambulator

+0

@shambulator katılmıyorum, Andrei Alexandrescu diyor ki: "D, void main(), normal dönüşte işletim sistemine sıfır (başarı) ve istisna dışında sıfırdan döner." ve bu benim için çok mantıksız, benimle aynı fikirde misin? –

6

main() birkaç olası imzaları vardır:

void main() 
void main(string[] args) 
void main(char[][] args) 
void main(wstring[] args) 
void main(wchar[][] args) 
void main(dstring[] args) 
void main(dchar[][] args) 
int main() 
int main(string[] args) 
int main(char[][] args) 
int main(wstring[] args) 
int main(wchar[][] args) 
int main(dstring[] args) 
int main(dchar[][] args) 

int dönüş türü ise, o zaman var hemen hemen aynı C veya C++ olduğunu. Geri döndüğünüz değer, OS/kabuğun gördüğü değerdir. Bir özel durum atılırsa, yığın izi yazdırılır ve OS/kabuk sıfırdan farklı bir değer görür. Ne olduğunu bilmiyorum. İstisna türüne göre değişebilir. void dönüş türü ise

, daha sonra, OS/kabuk, bir özel durum ise, bir yığın izlemesi basılır 0'a görür ve OS sıfır olmayan bir değer görür. Yine, ne olduğunu bilmiyorum.

Esasen, ana sahip geçersiz OS/kabuk için bir değer dönen dert sağlar. Çoğu program, geri dönüş başarısı veya OS/kabuğun arızalanması ile ilgili değildir. Yani, boşluğa sahip, OS/kabuk daima bir özel durum olmadıkça 0 alır - hangi mantıklı bir istisna main() kaçar eğer bu noktada tek bir program hatası olduğu için. OS/kabuğuna başarılı veya başarısız dönen hakkında umurumda , o zaman basitçe int döndüren sürümlerinden birini kullanın.

Farklı dize türleri nedeniyle imzaların çokluğu, olası dize türlerini main() numaralı girdi olarak kullanabilmenizdir. main() ve main(string[] args), muhtemelen en yaygın kullanılanlardır. void dönüş türü ile

12

sadece ben açıklanan çıkış kodu için kısaltmadır. İşletim sistemine döndürülen sıfır veya sıfır sıfır, bir işlev dönüş değeri değil, bir (dilden bağımsız) işlem çıkış kodudur. İşletim sistemi doğrudan main'u arayamaz ve main doğrudan işletim sistemine geri dönmez.D derleyici, diğer diller için hemen hemen tüm diğer derleyiciler gibi, işletim sistemiyle bu etkileşimleri işlemek için programınıza başlangıç ​​ve kapatma kodunu ekler. Başlangıçta, örneğin, bu yardımcı kod, komut satırı argümanlarını almak için bazı OS-bağımlı mekanizmaları kullanır ve bunları main'a geçmek için D string[] dizisine koyar. Kapatmada, çıkış kodu için int main döndürme değerini kullanır veya void main için kendi değerini kullanır (başarı için 0, işlenmeyen istisna için sıfır olmayan). pseudocode

:

// Generated by compiler 
void _realMain() 
{ 
    // OS-dependent; probably calls GetCommandLineW 
    // and CommandLineToArgvW on Windows, for example 
    string[] cmdLineArgs = createArgArray(); 

    int exitCode = 0; // Assume success 
    try 
    { 
     // static if selects only one call to main for compilation, 
     // depending on main's return type. 

     // If main has been written to return int, use its value for the exit code 
     static if (main returns int) 
      exitCode = main(cmdLineArgs); 
     // If main has been declared void, just run it and keep the exit code of 0 
     else 
      // void main: *doesn't return anything* 
      main(cmdLineArgs); 
    } 
    catch 
    { 
     // Unhandled exception results in non-zero exit code 
     exitCode = 1; 
     printStackTrace(); 
    } 

    // OS-dependent process shutdown function. 
    // This is where the exit code is "returned" to the OS. 
    // Note it *does not* use the return keyword to do so. 
    // Calling the OS's function to kill the current process 
    // does not return, because the process is dead by the 
    // time the function has finished! 
    exitProcess(exitCode); 
    // In particular, no code *after* the exitProcess line will run. 
} 
İlgili konular