Ana() C ve C++ ' da ne dönmelidir?

18 ответов

main için dönüş değeri, programın nasıl çıkıldığını belirtmelidir. Normal çıkış genellikle main 0 dönüş değeri ile temsil edilir . Anormal sonlandırma genellikle sıfır olmayan bir dönüşle işaretlenir, ancak sıfır olmayan kodların nasıl yorumlandığına dair bir standart yoktur. Ayrıca diğerleri tarafından belirtildiği gibi, void main() C++ standardı tarafından açıkça yasaklanmıştır ve kullanılmamalıdır. Geçerli c++ main imzalar şunlardır:

int main()

ve

int main(int argc, char* argv[])

eşdeğerdir

int main(int argc, char** argv)

ayrıca, C++' da, int main() , 0 döndürmeyi varsayılan olarak hangi noktada bir dönüş değeri olmadan bırakılabileceğini de belirtmek gerekir. Bu aynı zamanda bir C99 programı ile de geçerlidir. Dönüş 0 atlanıp atılmamalı olup olmadığı tartışmaya açıktır. Geçerli C programı ana imzaların aralığı çok daha büyüktür.

ayrıca, verimlilik main işleviyle ilgili bir sorun değildir. C++ standardına göre yalnızca bir kez girilebilir ve bırakılabilir (program başlatma ve sonlandırma işaretleme). C için, durum farklıdır ve main() yeniden girme izin verilir, ancak muhtemelen kaçınılmalıdır.

478
cevap workmad3 2018-01-22 16:49:38
kaynak

kabul edilen cevap C++ için targetted gibi görünüyor, bu yüzden C ile ilgili bir cevap ekleyeceğimi düşündüm ve bu birkaç şekilde farklıdır.

ISO / IEC 9899: 1989 (C90):

main() ya da bildirilmelidir:

int main(void)
int main(int argc, char **argv)

veya eşdeğer. Örneğin, int main(int argc, char *argv[]) ikincisine eşdeğerdir. Ayrıca, int dönüş türü varsayılan olarak ihmal edilebilir.

bir uygulama buna izin verirse, main() başka şekillerde bildirilebilir, ancak bu, programın uygulanmasını tanımlamaz ve artık kesinlikle uymaz.

standart kesinlikle (Yani, uygulama tanımlı davranış güvenmez) uygun dönen 3 değerleri tanımlar: 0 ve EXIT_SUCCESS başarılı bir sonlandırma için, ve EXIT_FAILURE başarısız bir sonlandırma için. Diğer değerler standart olmayan ve uygulama tanımlı. main() tanımsız davranışlardan kaçınmak için sonunda açık bir return ifadesine sahip olmalıdır.

son olarak, bir programdan main() çağırarak bir bakış açısı yanlış bir şey yoktur.

ISO/IEC 9899:1999 (C99):

C99 için, her şey hariç yukarıda aynıdır:

  • int dönüş türü ihmal edilemez.
  • iade bildirimini main() dan atlayabilirsiniz . Eğer yaparsanız ve main() bitmiş, örtük return 0 var.
140
cevap Chris 2017-08-05 20:45:56
kaynak

Standart C-Barındırılan Ortam

Barındırılan bir ortam için

(normal olan), C11 standardı (ISO/IEC 9899:2011) şunları söylüyor:

5.1.2.2.1 program başlangıç

program başlangıcında adı verilen işlev main olarak adlandırılır . Uygulama hayır beyan eder bu işlev için prototip. Bu int bir dönüş türü ile tanımlanır ve hiçbir parametre:

int main(void) { /* ... */ }

veya iki parametreli (burada argc ve argv olarak anılacaktır), ancak herhangi bir isim olabilir kullanılırlar, bildirildikleri işleve yerel oldukları için):

int main(int argc, char *argv[]) { /* ... */ }

veya eşdeğeri; 10) veya başka bir uygulama tanımlı şekilde.

bildirilirse, ana işlevin parametreleri Aşağıdakilere uyacaktır kısıtlamalar:

  • değeri argc negatif olmayacaktır.
  • argv[argc] null işaretçi olacaktır.
  • değeri argc sıfırdan büyükse, dizi üyeleri argv[0] . argv[argc-1] , verilen dizelere işaretçiler içermelidir program başlatmadan önce ana bilgisayar ortamı tarafından uygulama tanımlı değerler. Bu niyet arz etmektir program başlangıcından önce belirlenen program bilgilerine barındırılan ortamdaki başka yerlerden. Ana bilgisayar ortamı yeteneğine sahip değilse hem büyük hem de küçük harflerdeki harflerle dizeleri sağlama, uygulama dizelerin küçük harflerle alındığından emin olun.
  • değeri argc sıfırdan büyükse, dize argv[0] tarafından işaret etti program adını temsil eder; argv[0][0] null karakter olacaktır bu Program adı ana bilgisayar ortamından kullanılamaz. argc değeri ise birden büyük, dizeleri tarafından işaret argv[1] argv[argc-1] program parametrelerini temsil eder.
  • parametreler argc ve argv ve argv dizisi tarafından işaret edilen dizeler. program tarafından değiştirilebilir ve program arasındaki son depolanan değerlerini korur başlangıç ve program sonlandırma.

10) böylece, int int olarak tanımlanan bir typedef adı ile değiştirilebilir veya argv türü şu şekilde yazılabilir char **argv ve benzeri.

Program sonlandırma c99 veya c11

main() den döndürülen değer, uygulama tanımlı bir şekilde 'çevreye' iletilir.

5.1.2.2.3 program sonlandırma

1 main işlevinin dönüş türü int ile uyumlu bir tür ise , main işlevine İlk Çağrı, exit işlevini değerle çağırmaya eşdeğerdir bağımsız değişkeni olarak main işleviyle döndürülür; 11) sonlandırır } ulaşan main işlevi 0 değerini döndürür. Dönüş türü ise int ile uyumlu değildir, ana bilgisayar ortamına döndürülen sonlandırma durumu belirtilmemiştir.

11) 6.2.4 uyarınca, main olarak ilan edilen otomatik depolama süresine sahip nesnelerin ömrü onlar İkinci olmazdı bile, eski durumda sona ermiş olacaktır.

0 'başarı' olarak zorunlu olduğunu unutmayın. Kullanabilirsiniz EXIT_FAILURE ve EXIT_SUCCESS dan <stdlib.h> tercih ederseniz, ancak 0 iyi kurulmuş ve 1'dir. Ayrıca Bkz. 255'den büyük çıkış kodları - mümkün mü? .

C89'da (ve dolayısıyla Microsoft C'de), main() işlevinin döndürülmesi ancak bir dönüş değeri belirtmemesi durumunda ne olacağı hakkında bir açıklama yoktur; bu nedenle tanımsız davranışa yol açar.

7.22.4.4 exit işlev

¶5 Son olarak, kontrol ana ortama döndürülür. status değeri sıfır veya EXIT_SUCCESS ise, başarılı sonlandırma durumunun bir uygulama tanımlı formu döndürülür. status değeri EXIT_FAILURE ise, başarısız sonlandırma durumunun bir uygulama tanımlı formu döndürülür. Aksi halde döndürülen durum uygulama tanımlı.

Standart C++ - Barındırılan Ortam

C++11 Standart (ISO/IEC 14882:2011) diyor ki:

3.6.1 ana fonksiyon [temel .Başla.ana]

¶1 Bir program, programın belirlenen başlangıcı olan main adlı küresel bir işlevi içerecektir. [...]

¶2 bir uygulama ana işlevi önceden belirlemeyecektir. Bunca işlev aşırı yüklenmeyecektir. Öyle. dönüş türü türü var int, ancak aksi takdirde türü tanımlı değil. Tamam.

: ana aşağıdaki tanımları her ikisi de izin verecektir
int main() { /* ... */ }

ve

int main(int argc, char* argv[]) { /* ... */ }

ikinci formda argc çevreden programa geçirilen argümanların sayısı olacaktır programın çalıştırıldığı. argc bu bağımsız değişkenleri sıfır değilse argv[0] argv[argc-1] ile null sonlandırılmış çok baytlı dizeler (NTMBSs) (17.5.2.1.4.2) ve argv[0] ilk karakter için işaretçi bir NTMBS temsil eder. program veya "" çağırmak için kullanılan ad . argc değeri negatif olmayacaktır. argv[argc] değeri 0 olacak. [ Not: argv sonrasında başka (isteğe bağlı) parametrelerin eklenmesi önerilir . -sonlandırmak not]

- 3 main işlevi bir program içinde kullanılamaz. main bağlantı (3.5) uygulama tanımlı. [...]

¶5 Main'deki bir dönüş ifadesi, ana işlevi terk etme etkisine sahiptir (herhangi bir nesneyi otomatik olarak yok eder depolama süresi) ve arama std::exit dönüş değeri bağımsız değişken olarak. Kontrol sonuna ulaşırsa bir dönüş deyimi karşılaşmadan ana, etki,

return 0;

C++ standardı açıkça " [ana işlev] int türünde bir dönüş türüne sahip olacak, ancak aksi takdirde türü "tanımlanmış" diyor ve C standardının seçenek olarak desteklenmesiyle aynı iki imzayı gerektiriyor. Yani bir' void main () ' doğrudan C++ standardı tarafından izin verilmez, ancak alternatiflere izin veren standart dışı bir uygulamayı durdurmak için yapabileceği hiçbir şey yoktur. Not bu C++, kullanıcının main çağırmasını yasaklıyor (ancak C standardı değil).

§18.5 başlangıç ve sonlandırma paragrafı ile aynı olan C++11 standardında §7.22.4.4 paragrafı var exit işlevi C11 standardında (yukarıda belirtilen), bir dipnot dışında ( EXIT_SUCCESS ve EXIT_FAILURE olarak tanımlanan EXIT_FAILURE belgeleyen <cstdlib> ).

Standart C-Ortak Uzatma

klasik olarak, Unix sistemleri üçüncü bir varyant destekler:

int main(int argc, char **argv, char **envp) { ... }

üçüncü bağımsız değişken, her biri bir ad, eşittir işareti ve bir değer (muhtemelen boş) olan bir ortam değişkeni olan dizelere işaretçilerin boş sonlandırılmış bir listesidir. Bunu kullanmazsanız, ' extern char **environ; ' aracılığıyla çevreye hala ulaşabilirsiniz. Uzun bir süre için, bunu ilan eden bir başlık yoktu, ama POSIX 2008 standardı şimdi <unistd.h> ilan edilmesini gerektirir .

bu ek J belgelenmiş ortak bir uzantısı olarak C standardı tarafından kabul edilmektedir:

J. 5.1 ortam bağımsız değişkenleri

¶ 1 barındırılan bir ortamda, ana işlevi üçüncü bir argüman alır, char *envp[] , bu , her biri char için null sonlandırılmış bir işaretçi dizisine işaret eder bir dizeye işaret eden bu, programın bu yürütülmesi için ortam hakkında bilgi sağlar (5.1.2.2.1).

Microsoft C

Microsoft vs 2010 derleyici ilginç. Web sitesi diyor ki:

main için bildirim sözdizimi

 int main();

veya

int main(int argc, char *argv[], char *envp[]);

alternatif olarak, main ve wmain işlevleri void (dönüş değeri yok) döndürülerek bildirilebilir. main veya wmain değerini dönen boşluk olarak bildirirseniz, bir dönüş ifadesi kullanarak üst işlem veya işletim sistemine bir çıkış kodu döndüremezsiniz. main veya wmain void olarak bildirildiğinde, exit işlevini kullanmanız gerekir.

öyle void main() ile bir program çıktığında (ana veya işletim sistemine hangi çıkış kodu döndürülür) ne olduğunu bana açık değil-ve MS web sitesi de sessiz.

ilginçtir ki, MS, C ve C++ standartlarının gerektirdiği main() iki bağımsız değişkenli sürümünü reçete etmez. Yalnızca üçüncü bağımsız değişkenin char **envp olduğu üç bağımsız değişken formu , ortam değişkenlerinin bir listesine işaretçi öngörür.

Microsoft sayfası da diğer bazı alternatifleri listeler - wmain() geniş karakter dizeleri alır ve biraz daha fazlası.

Microsoft Visual Studio 2005 sürüm Bu sayfa liste değil void main() alternatif olarak. sürümleri Microsoft Visual Studio 2008 itibaren yapmak.

Standart C-Bağımsız Ortam

erken saatlerde belirtildiği gibi, yukarıdaki gereksinimler barındırılan ortamlar için geçerlidir. Bağımsız bir ortamla (barındırılan bir ortama alternatif olan) çalışıyorsanız, standartın söyleyecek çok daha azı vardır. Bağımsız bir ortam için, program başlangıcında adı verilen işlev main olarak adlandırılamaz ve dönüş türü üzerinde herhangi bir kısıtlama yoktur. Standart diyor ki:

5.1.2 yürütme ortamları

iki yürütme ortamı tanımlanır: bağımsız ve barındırılan. Her iki durumda da, belirlenmiş bir C işlevi yürütme tarafından çağrıldığında program başlatma oluşur çevre. Statik depolama süresi olan tüm nesneler program başlatmadan önce başlatılacaktır (başlangıç değerlerine ayarlanır). Bu tür başlatma şekli ve zamanlaması aksi belirtilmemiştir. Program sonlandırma yürütme ortamına denetimi döndürür.

5.1.2.1 Bağımsız Ocak

bağımsız bir ortamda (C Program yürütülmesinin bir işletim sisteminin herhangi bir yararı olmadan gerçekleşebileceği), program başlangıcında adı ve türü uygulama tanımlıdır. Bağımsız bir program, 4 maddesince gerekli minimum set dışında, mevcut herhangi bir kütüphane imkanları tanımlanan uygulanması.

bağımsız bir program sonlandırma etkisi çevre tanımlanan uygulamasıdır.

Madde 4 uygunluk için çapraz başvuru şu ifade eder:

¶5 A kesinlikle uygun program bu uluslararası standartta belirtilen Dil ve kütüphanenin sadece bu özelliklerini kullanacaktır. 3) belirtilmemiş, tanımlanmamış veya uygulama tanımlı davranışlara bağımlı çıktı üretmez ve minimum uygulama limitini aşmayacaktır.

' 6 uygun uygulama iki biçimi , ve bağımsız . ev sahipliğinde uygulamaya uygun herhangi bir kesinlikle uygun programı kabul eder. bağımsız uygulamaya uygun , belirtilen özelliklerin kullanılmasının kesinlikle uyulması gereken herhangi bir programı kabul eder. library yan tümcesi (Madde 7), standart başlıkların içeriğiyle sınırlıdır <float.h> , <iso646.h> , <limits.h> , <stdalign.h> , <stdarg.h> , <stdbool.h> , <stddef.h> , <stdint.h> , ve <stdnoreturn.h> . Uyumlu bir uygulama uzantıları olabilir (dahil ek kütüphane işlevleri), herhangi bir kesinlikle uygun programın davranışını değiştirmedikleri takdirde. 4)

' 7 A uyumluluk program uygun bir uygulama için kabul edilebilir biridir. 5)

3) kesinlikle uygun bir program koşullu özellikleri kullanabilir (bkz.6.10.8.3) kullanım, ilgili makro kullanarak uygun bir koşullu içerme ön işleme yönergesi tarafından korunursa. Örneğin:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

4) bu bir uyum anlamına gelir uygulama, bu uluslararası standarda açıkça ayrılmış olanlar dışında hiçbir tanımlayıcıyı saklı tutar.

5) kesinlikle uygun programlar uyumlu uygulamalar arasında maksimum taşınabilir olması amaçlanmıştır. Uyumlu programlar, uyumlu bir uygulamanın taşınabilir olmayan özelliklerine bağlı olabilir.

bağımsız bir ortamın tek başlığının gerekli olduğu fark edilir aslında herhangi bir işlevi <stdarg.h> olarak tanımlar (ve hatta bunlar - ve genellikle-sadece makrolar olabilir).

Standart C++ - Bağımsız Ortam

tıpkı C standardı hem barındırılan hem de bağımsız ortamı tanır, bu yüzden de C++ standardını yapar. (ISO/IEC 14882:2011'den alıntılar.)

1.4 uygulama uyumluluğu [giriş.uyumluluk]

- 7 iki çeşit uygulamaları tanımlanır: barındırılan uygulama ve bağımsız uygulama . Barındırılan bir uygulama için bu uluslararası standart, kullanılabilir kitaplıklar kümesini tanımlar. Bağımsız uygulama, yürütmenin bir işletim sisteminin yararı olmadan gerçekleşebileceği ve belirli dil desteği kitaplıklarını (17.6.1.3) içeren uygulama tanımlı bir kitaplık kümesine sahip olduğu bir uygulamadır.

¶8 uyumlu bir uygulama, iyi biçimlendirilmiş herhangi bir programın davranışını değiştirmedikleri takdirde uzantılar (ek kütüphane işlevleri dahil) olabilir. Uygulamaları programları teşhis etmek için gereklidir bu uluslararası standartlara göre kötü oluşturulmuş bu uzantıları kullanın. Bununla birlikte, bunu yaptıktan sonra, bu tür programları derleyebilir ve yürütebilirler.

¶9 her uygulama tüm tanımlayan belgeleri içerecektir koşullu olarak desteklenen yapıları desteklemiyor ve tüm yerel ayar özgü özelliklerini tanımlar. 3

3) bu Dokümantasyon, uygulama tanımlı davranışı da tanımlar; bkz. 1.9.

17.6.1.3 ayrı duran '[uygunluk]

iki tür uygulama tanımlanır: barındırılan ve bağımsız (1.4). Bir hosted için uygulama, bu uluslararası standart kullanılabilir üstbilgileri kümesini açıklar.

bağımsız bir uygulama, uygulama tanımlı bir üstbilgi kümesine sahiptir. Bu set, Tablo 16'da gösterilen en azından başlıkları içermelidir.

başlığın verilen sürümü <cstdlib> en azından işlevleri beyan eder abort , atexit , at_quick_exit , exit , ve quick_exit (18.5). Diğer başlıklar Bu tabloda listelenen barındırılan uygulama için aynı gereksinimleri karşılaması gerekir.

bağımsız uygulamalar için Tablo 16 - C++ başlıkları

Subclause                           Header(s)
                                    <ciso646>
18.2  Types                         <cstddef>
18.3  Implementation properties     <cfloat> <limits> <climits>
18.4  Integer types                 <cstdint>
18.5  Start and termination         <cstdlib>
18.6  Dynamic memory management     <new>
18.7  Type identification           <typeinfo>
18.8  Exception handling            <exception>
18.9  Initializer lists             <initializer_list>
18.10 Other runtime support         <cstdalign> <cstdarg> <cstdbool>
20.9  Type traits                   <type_traits>
29    Atomics                       <atomic>

C'de int main() kullanmaya ne dersiniz?

C11 standardının standart §5.1.2.2.1, tercih edilen notasyonu gösterir - int main(void) - ancak int main() gösteren standartta iki örnek de vardır: §6.5.3.4 ¶8 ve §6.7.6.3 ¶20 . Şimdi, örneklerin 'normatif' olmadığını belirtmek önemlidir; bunlar sadece açıklayıcı. Örneklerde hata varsa, standartın ana metnini doğrudan etkilemez. Bununla birlikte, beklenen davranışın güçlü bir şekilde göstergesidir, bu nedenle standart bir örnekte int main() içeriyorsa, int main() in tercih edilen gösterim olmasa bile yasak olmadığını göstermektedir.

6.5.3.4 sizeof ve _Alignof operatörleri

...

¶8 örnek 3 Bu örnekte, değişken uzunluk dizisinin boyutu hesaplanır ve bir işlevden döndürülür:

#include <stddef.h>

size_t fsize3(int n)
{
    char b[n+3]; // variable length array
    return sizeof b; // execution time sizeof
}
int main()
{
    size_t size;
    size = fsize3(10); // fsize3 returns 13
    return 0;
}
102
cevap Jonathan Leffler 2017-10-05 03:43:05
kaynak

ben main() EXIT_SUCCESS veya EXIT_FAILURE dönmek gerektiğine inanıyoruz . Onlar stdlib.h

tanımlanır
57
cevap dmityugov 2012-09-28 07:31:37
kaynak

C ve C++ standartlarının iki tür uygulama tanımladığını unutmayın: bağımsız ve barındırılan.

  • c90 'çevre

    izin verilen formlar 1 :

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    yorumlar:

    eski ikisi açıkça izin verilen formlar olarak ifade edilir, Diğerleri örtülü olarak izin verilir çünkü c90 izin verilir dönüş türü ve işlev parametreleri için "örtülü int". Başka bir forma izin verilmez.

  • c90 ayrı duran ortam

    ana herhangi bir form veya adı 2 izin verilir .

  • c99'

    izin verilen formlar 3 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    

    yorumlar:

    c99 kaldırıldı "örtük int" yani main() artık geçerli değil.

    garip, belirsiz bir cümle "veya başka bir uygulama tanımlı şekilde" tanıtıldı. Bu, " int main() parametreleri değişebilir" veya "ana herhangi bir uygulama tanımlı forma sahip olabilir"olarak yorumlanabilir.

    bazı Derleyiciler standardı ikinci şekilde yorumlamayı seçtiler. Tartışmasız olarak, belirsiz olduğu için standardın kendi başına gerekçe göstererek kesinlikle uymadıklarını kolayca belirtemez.

    ancak, main() tamamen vahşi formları izin muhtemelen(?) bu yeni cümlenin niyeti değil. C99 mantığı (normatif değil), cümlenin ek parametreleri ifade ettiğini ima eder int main 4 .

    henüz barındırılan çevre programı için bölüm fesih daha sonra ana 5 dönmez durum hakkında savunarak devam ediyor . Bu bölüm, maın'in nasıl ilan edilmesi gerektiği konusunda normatif olmasa da, maın'in barındırılan sistemlerde bile tamamen uygulama tanımlı bir şekilde ilan edilebileceğini kesinlikle ima eder.

  • c99 ayrı duran ortam

    any form or name of main is allowed 6 .

  • c11 '

    izin verilen formlar 7 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    
  • c11 bağlantısız ortam

    ana herhangi bir form veya adı 8 izin verilir .


not int main() yukarıdaki sürümlerden herhangi birinde C barındırılan herhangi bir uygulama için geçerli bir form olarak listelenen asla. C, C++ aksine, () ve (void) farklı anlamları var. Eski dilden kaldırılabilir eskime özelliğidir. Bkz. c11 gelecek dil yönergeleri:

6.11.6 işlev bildiricileri

boş parantez ile işlev bildiricileri kullanımı (değil prototype-format parameter type declarators) bir eskime özelliğidir.


  • C ++ 03 barındırılan ortam

    izin verilen formlar 9 :

    int main ()
    int main (int argc, char *argv[])
    

    yorumlar:

    ilk formda boş parantezi not edin. C++ ve C bu durumda farklıdır, çünkü c++ ' da bu demektir fonksiyonun parametre almadığını. Ancak C'de herhangi bir parametre alabileceği anlamına gelir.

  • C++03 ayrı duran ortam

    başlangıçta adı verilen işlevin adı uygulama tanımlı. main() olarak adlandırılırsa, belirtilen formları takip etmelidir 10 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    
  • c++11 barındırılan çevre

    izin verilen formlar 11 :

    int main ()
    int main (int argc, char *argv[])
    

    yorumlar:

    standardın metni değiştirildi ancak aynı anlamı var.

  • C++11 ayrı duran ortam

    başlangıçta adı verilen işlevin adı uygulama tanımlı. main() adı verilirse belirtilen formları takip etmelidir 12 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

Referanslar

  1. ANSI X3.159-1989 2.1.2.2 barındırılan ortam. "Program başlangıç "

    program başlangıcında adı verilen işlev ana olarak adlandırılır. Bu uygulama bu işlev için prototip beyan eder. Öyle. olmak int dönüş türü ve hiçbir parametre ile tanımlanır:

    int main(void) { /* ... */ } 
    

    veya iki parametreli (burada argc ve argv, yerel oldukları gibi herhangi bir isim kullanılabilir olsa da bildirildiği işlev):

    int main(int argc, char *argv[]) { /* ... */ }
    
  2. ANSI X3.159-1989 2.1.2.1 bağımsız ortam:

    bir bağımsız ortam (hangi C Program yürütme alabilir bir işletim sisteminin herhangi bir yararı olmadan yerleştirin), adı ve türü program başlangıcında adı verilen işlev uygulama tanımlı.

  3. ISO 9899: 1999 5.1.2.2 barındırılan ortam - > 5.1.2.2.1 program başlangıç

    program başlangıcında adı verilen işlev ana olarak adlandırılır. Bu uygulama için prototip beyan eder bu işlev. Olacak int dönüş türü ve hiçbir parametre ile tanımlanır:

    int main(void) { /* ... */ } 
    

    veya iki parametreli (burada argc ve argv, yerel oldukları gibi herhangi bir isim kullanılabilir olsa da bildirildiği işlev):

    int main(int argc, char *argv[]) { /* ... */ }
    

    veya eşdeğer;9) veya diğer bazı uygulama tanımlı tutum.

  4. uluslararası standart programlama dilleri için gerekçe-C, Revizyon 5.10. 5.1.2.2 barındırılan ortam - > 5.1.2.2.1 program başlangıç

    argümanların ana davranış ve çıkış, ana ve atexit etkileşimi (bkz. §7.20.4.2), argv'nin temsilinde bazı istenmeyen çeşitliliği frenlemek için kodlanmıştır dizeleri ve ana tarafından döndürülen değerlerin anlamı.

    argc ve argv'nin ana argümanlar olarak spesifikasyonu kapsamlı bir önceki uygulamayı tanır. argv [argc], ortak uygulama temelinde de listenin sonu için gereksiz bir kontrol sağlamak için boş bir işaretçi olması gerekir.

    ana portably sıfır veya iki bağımsız değişken ile bildirilebilir tek işlevidir. (Diğer işlevlerin bağımsız değişkenlerinin sayısı, çağırma ve tanım arasında tam olarak eşleşmelidir.) Bu özel durum sadece program bağımsız değişken dizelerine erişmediğinde argümanları ana olarak bırakmanın yaygın uygulamasını tanır. Birçok uygulama ana iki argümandan fazla desteklerken, bu tür uygulama ne kutsanmış ne de standart tarafından yasaklanmıştır; ana üç argümanla tanımlayan bir program kesinlikle uygun değildir (bkz. §J. 5.1.).

  5. ISO 9899: 1999 5.1.2.2 barındırılan ortam - > 5.1.2.2.3 programı sonlandırma

    ana işlevin dönüş türü int ile uyumlu bir tür ise, ilk çağrıdan ana işleve dönüş, bağımsız değişkeni olarak ana işlev tarafından döndürülen değerle çıkış işlevini çağırmaya eşdeğerdir;11) ana işlevi sonlandıran } değerine ulaşan 0 değerini döndürür. Dönüş türü int ile uyumlu değilse, ana bilgisayar ortamına döndürülen sonlandırma durumu belirtilmemiştir.

  6. ISO 9899: 1999 5.1.2.1 bağımsız ortam

    bağımsız bir ortamda (C Program yürütülmesinin bir işletim sisteminin herhangi bir yararı olmadan gerçekleşebileceği), program başlangıcında adı ve türü uygulama tanımlıdır.

  7. ISO 9899:2011 5.1.2.2 barındırılan ortam -> 5.1.2.2.1 program başlangıç

    bu bölüm yukarıda belirtilen C99 ile aynıdır.

  8. ISO 9899: 1999 5.1.2.1 bağımsız ortam

    bu bölüm yukarıda belirtilen C99 ile aynıdır.

  9. ISO 14882: 2003 3.6.1 ana fonksiyon

    bir uygulama ana işlevi predefine olmayacaktır. Bunca işlev aşırı yüklenmeyecektir. Dönüş türü türü int olacaktır, ancak aksi takdirde türü uygulama tanımlı. Tüm uygulamalar, aşağıdaki main tanımlarının her ikisine de izin verecektir:

    int main() { /* ... */ }
    

    ve

    int main(int argc, char* argv[]) { /* ... */ }
    
  10. ISO 14882: 2003 3.6.1 ana fonksiyon

    uygulama tanımlı olup olmadığını ana işlevi tanımlamak için bağımsız bir ortamda program gereklidir.

  11. ISO 14882: 2011 3.6.1 ana fonksiyon

    bir uygulama ana işlevi predefine olmayacaktır. Bu işlev aşırı yüklenmeyecektir. Dönüş türü türü int olacaktır, ancak aksi takdirde türü uygulama tanımlı. Tüm uygulamalar hem

    izin

    - a fonksiyonu () dönen int ve

    - int

    dönen (int, işaretçi işaretçi için char) bir işlevi

    ana tip olarak (8.3.5).

  12. ISO 14882: 2011 3.6.1 ana fonksiyon

    bu bölüm yukarıda belirtilen c++03 ile aynıdır.

29
cevap Lundin 2018-02-21 10:08:17
kaynak

hata için başarı ve sıfır olmayan 0 döndürür. Bu program ile ne olduğunu öğrenmek için UNİX ve DOS komut dosyası tarafından kullanılan standarttır.

27
cevap Lou Franco 2008-10-15 16:16:51
kaynak

unutmayın ki, bir int döndürüyor olsanız bile, bazı işletim sistemleri (Windows) döndürülen değeri tek bir bayt (0-255) keser.

7
cevap Ferruccio 2008-10-15 19:22:13
kaynak
'1519110920 ’`151920920' c89 ve k&r c belirtilmemiş dönüş türleri varsayılan olarak 'int'.

return 1? return 0?
  1. int main() bir dönüş ifadesi yazmazsanız , kapanış { varsayılan olarak 0 döndürür.

  2. return 0 veya return 1 ana işlem tarafından alınacaktır. Bir kabukta bir kabuk değişkenine girer ve programınızı çalıştırıyorsanız bir kabuk oluşturur ve değil bu değişkeni kullanarak main() dönüş değeri hakkında endişelenmenize gerek yok.

bkz. ana işlevimin geri döndüğünü nasıl alabilirim? .

$ ./a.out
$ echo $?

bu şekilde main() dönüş değerinin en az önemli baytını alan $? değişkeni olduğunu görebilirsiniz .

Unix ve DOS komut dosyası, return 0 başarı ve hata için sıfır olmayan genellikle döndürülür. Bu, programınızla neler olduğunu öğrenmek ve tüm akışı kontrol etmek için Unix ve DOS komut dosyası tarafından kullanılan standarttır.

7
cevap Jeegar Patel 2018-02-21 03:14:24
kaynak

dönüş değeri, programın nasıl kapatıldığını kontrol etmek için işletim sistemi tarafından kullanılabilir.

dönüş değeri 0 genellikle çoğu işletim sisteminde Tamam anlamına gelir(yine de düşünebildiğim).

bir işlemi kendiniz çağırdığınızda da kontrol edilebilir ve programın çıkılıp çıkmadığını ve düzgün bir şekilde bitirildiğini görebilirsiniz.

değil sadece bir programlama sözleşmesi.

4
cevap Yochai Timmer 2016-03-13 18:14:22
kaynak

main() dönüş değeri, programın nasıl çıkıldığını gösterir. Dönüş değeri zero ise, herhangi bir sıfır olmayan değer bir şey yürütülmesinde kötü gitti temsil ederken yürütme başarılı olduğu anlamına gelir.

3
cevap Fahad Uddin 2016-03-13 18:14:52
kaynak

standardın, başarılı bir dönüşün OS tabanlı olduğu için bir dönüş değerine ihtiyaç duymadığını belirttiği izlenimi altındaydım (birinde sıfır bir başarı ya da başka bir hata olabilir), bu nedenle geri dönüşün olmaması, derleyici için başarılı dönüşün kendisini eklemek için bir işaretti.

ancak genellikle 0 döndürüyorum.

2
cevap graham.reeds 2008-10-15 16:42:47
kaynak

- 0, programcıya programın işi başarıyla tamamladığını söylemelidir.

2
cevap Vamsi Pavan Mahesh 2016-03-13 18:18:42
kaynak

ne dönmek için yürütülebilir dosya ile ne yapmak istediğinize bağlıdır. Örneğin, programınızı bir komut satırı kabuğuyla kullanıyorsanız, bir başarı için 0 ve başarısızlık için sıfır olmayan bir dönüş yapmanız gerekir. Ardından, kodunuzun sonucuna bağlı olarak koşullu işleme ile birlikte programı kullanabilirsiniz. Ayrıca yorumunuza göre herhangi bir sıfır olmayan değer atayabilirsiniz, örneğin kritik hatalar için farklı program çıkış noktaları ile bir programı sonlandırabilir farklı çıkış değerleri ve döndürülen değeri inceleyerek ne yapacağınıza karar verebilecek arama kabuğuna kullanılabilir. Kod kabuklarla kullanılmak üzere tasarlanmadıysa ve döndürülen değer kimseyi rahatsız etmezse, ihmal edilebilir. Şahsen int main (void) { .. return 0; .. }

imzasını kullanıyorum
1
cevap phoxis 2012-09-28 07:32:13
kaynak

bir işlemden bir tamsayı döndürmenin verimliliği ile ilgili sorunlarınız varsa, muhtemelen bu işlemi bu dönüş değerinin bir sorun haline gelmesi için birçok kez çağırmaktan kaçınmalısınız.

bunu yapıyorsanız (bir işlemi birçok kez çağırın), mantığınızı doğrudan arayanın içine veya her çağrı için belirli bir işlem ayırmadan bir DLL dosyasına koymanın bir yolunu bulmalısınız; birden çok işlem size ilgili verimlilik sorunu getirir bu durumda.

ayrıntılı olarak, yalnızca 0 döndürmenin 1 döndürmekten daha fazla veya daha az verimli olup olmadığını bilmek istiyorsanız, bazı durumlarda derleyiciden bağlı olabilir, ancak genel olarak, aynı kaynaktan (yerel, alan, sabit, kodda gömülü, işlev sonucu vb.) okunduğunu varsayarak. saat döngüleri tam olarak aynı sayıda gerektirir.

1
cevap Luca C. 2016-03-13 18:12:55
kaynak

C ve C++ - int main () veya void main () - ve neden ana() işlevini tanımlamanın doğru (en verimli) yolu nedir?

bu kelimeler" (en verimli) " soruyu değiştirmez. Bağımsız bir ortamda olmadığınız sürece, main() bildirmenin evrensel olarak doğru bir yolu vardır ve bu da int.

C ve C++' da main() ne döndürmeli?

main() dönüşü, main() dönüşü değil. main() , elbette, başkasının aradığı bir işlevdir. main() çağıran kod üzerinde herhangi bir kontrole sahip değilsiniz . Bu nedenle, main() , arayan ile eşleşen bir tür doğru imza ile bildirmeniz gerekir. Bu konuda başka seçeneğin yok. Kendinize az ya da çok ne olduğunu sormak zorunda değilsiniz verimli, ya da daha iyi ya da daha kötü bir stil ya da böyle bir şey, çünkü cevap zaten sizin için C ve C+ standartlarına göre mükemmel bir şekilde tanımlanmıştır. Sadece onları takip et.

int main() daha sonra 1 veya 0 döndürürse?

0 başarı için, başarısızlık için sıfır olmayan. Yine, seçmeniz gereken (veya almanız gereken) bir şey değil: Uymanız gereken arayüzle tanımlanır.

1
cevap Steve Summit 2017-10-04 00:56:28
kaynak

C++ ana işlevi olarak bildirilmelidir int main() ve değil void main() derleyici sonra void main durumunda bir hata atar gibi. Ana işlev,int main(int k,int l, int arr[]) veya int main(void) gibi herhangi bir sayıda argümanı alabilir.

#include <iostream>
using namespace std;

int main(void) {
    // your code goes here
    cout<<"a";
    return 0;
}

çıktı:

Success #stdin #stdout 0s 4416KB
a

geri dönüş kısmına geliyor, yalnızca 0 döndürmeli, derleyici bir hata atar. örneğin 1'i iade ederseniz, istediğiniz çıktıyı alırsınız ama aynı zamanda bir çalışma zamanı hatası atar.

örnek

#include <iostream>
using namespace std;

int main(int k,float m,char g, int arr[]) {
    // your code goes here
    k=0;
    cout<<k;
    g='a';
    cout<<g;
    cout<<"a";
    return 1;
}

çıktı:

Runtime error   #stdin #stdout 0s 4448KB
0aa
1
cevap Somit 2018-02-23 08:26:23
kaynak

burada dönüş kodlarının kullanımının küçük bir gösteri...

Linux terminalinin sağladığı çeşitli araçları kullanırken, işlem tamamlandıktan sonra hata işleme için örneğin dönüş kodunu kullanabilirsiniz. Aşağıdaki metin dosyası myfile mevcut olduğunu düşünün:

bu, grep'in nasıl çalıştığını kontrol etmek için bir örnektir.

grep komutunu çalıştırdığınızda a süreç oluşturulur. Bir kez bitti (ve kırmadı) 0 ile 255 arasında bir kod döndürür. Örneğin:

$ grep order myfile

yaparsanız

$ echo $?
$ 0

bir 0 alacaksınız. Niçin? Çünkü grep bir eşleşme buldu ve bir başarı ile çıkmak için olağan değer olan bir çıkış kodu 0 döndürdü. Tekrar kontrol edelim, ancak metin dosyamızın içinde olmayan bir şeyle ve dolayısıyla hiçbir eşleşme bulunmayacak:

$ grep foo myfile
$ echo $?
$ 1

grep, dosyamızın içeriğiyle "foo" belirteciyle eşleşemediğinden dönüş kodu 1'dir (bu, bir arıza oluştuğunda ancak yukarıda belirtildiği gibi seçim yapabileceğiniz çok sayıda değere sahip olduğunda olağan durumdur).

şimdi aşağıdaki bash betiği (sadece bir Linux terminaline yazın) çok basit olmasına rağmen hata işleme hakkında bazı fikir vermelidir:

$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found

ikinci satırdan sonra hiçbir şey "foo" dan bu yana terminale basılmaz" grep return 1'i yaptı ve grep'in dönüş kodunun 0'a eşit olup olmadığını kontrol ediyoruz. İkinci koşullu deyim, CHECK == 1 nedeniyle doğru olduğu için son satırdaki mesajını yankılanır.

bunu çağırıp çağırmadığınızı görebileceğiniz gibi ve bu işlem, ne döndürdüğünü görmek bazen önemlidir (main () dönüş değeri ile).

0
cevap rbaleksandar 2016-03-13 18:36:48
kaynak

Omit return 0

bir C veya C++ programı main sonuna ulaştığında derleyici otomatik olarak 0 dönmek için kod üretecektir, bu nedenle return 0; sonuna açıkça main koymak gerek yoktur .

not: bu öneriyi yaptığımda, neredeyse her zaman iki tür yorumdan biri tarafından takip edilir:" bunu bilmiyordum."ya da" bu kötü bir tavsiye!"Benim mantığım güvenli olmasıdır ve açıkça standart tarafından desteklenen derleyici davranışına güvenmek yararlıdır. C için, c99'dan beri; bkz. ISO / IEC 9899: 1999 bölüm 5.1.2.2.3:

[...] ilk çağrıdan main işlevine dönüş, exit işlevinin bağımsız değişkeni olarak main işleviyle döndürülen değerle çağrılmasına eşdeğerdir; } işlevinin sonlandırılmasına ulaşan main işlevinin 0 değerini döndürür .

C++ için, 1998'de ilk standarttan beri; bkz. ISO / IEC 14882: 1998 bölüm 3.6.1:

denetim bir dönüş deyimi karşılaşmadan ana sonuna ulaşırsa, etki dönüş 0 yürütülüyor;

o zamandan beri her iki standarttaki tüm sürümler (c99 ve C++98) aynı fikri korudu. C++ ' da otomatik olarak oluşturulan üye işlevlerine güveniyoruz ve birkaç kişi açık return; yazıyor void işlevinin sonunda ifadeler. Atlamaya karşı nedenler "garip görünüyor " kadar kaynar gibi görünüyor . Benim gibi, C standardına yapılan değişikliğin gerekçesini merak ediyorsanız, bu soruyu okuyun . Ayrıca, 1990'ların başında bunun "özensiz uygulama" olarak kabul edildiğini unutmayın, çünkü o zamanlar tanımsız davranıştı (yaygın olarak desteklenmesine rağmen).

bu yüzden atlamayı savunuyorum; Diğerleri katılmıyorum (genellikle)!) Her durumda, omits kodu karşılaşırsanız, açıkça standart tarafından desteklenen olduğunu bileceksiniz ve bunun ne anlama geldiğini bileceksiniz.

0
cevap Edward 2017-05-23 15:02:46
kaynak

Diğer sorular c c++ main return-value return-type