Standart C - Barındırılan Ortam
Barındırılan bir ortam için (bu normaldir), C11 standardı (ISO / IEC 9899: 2011) diyor ki:
5.1.2.2.1 Programın başlatılması
Program başlangıcında çağrılan işlev adlandırılır main
. Uygulama, bu işlev için herhangi bir prototip bildirmez. Geri dönüş tipi int
ve parametresiz olarak tanımlanmalıdır :
int main(void) { /* ... */ }
veya iki parametre ile (burada argc
ve olarak adlandırılırlar argv
, ancak bildirildikleri işlev için yerel olduklarından herhangi bir ad kullanılabilir):
int main(int argc, char *argv[]) { /* ... */ }
veya eşdeğer; 10) veya başka bir uygulama tarafından tanımlanan şekilde.
Bildirilirlerse, ana işleve ilişkin parametreler aşağıdaki kısıtlamalara uymalıdır:
- Değeri
argc
negatif olmayacaktır.
argv[argc]
boş gösterici olacaktır.
- Değeri ise
argc
sıfırdan büyük olduğu, dizi üyeleri argv[0]
ile
argv[argc-1]
, içerme , program başlatılmadan önce ana bilgisayar ortamı tarafından uygulama tanımlı değerler verilen dizelere işaretçiler içerecektir. Amaç, programın başlatılmasından önce, barındırılan ortamın başka bir yerinden belirlenen program bilgilerini sağlamaktır. Ana bilgisayar ortamı, hem büyük hem de küçük harf içeren harflerle dizeleri sağlayamıyorsa, uygulama dizelerin küçük harfle alınmasını sağlamalıdır.
- Değeri
argc
sıfırdan büyükse, ile gösterilen dize argv[0]
program adını gösterir; argv[0][0]
ana bilgisayar ortamında program adı yoksa boş karakter olacaktır. Değeri argc
birden büyükse, argv[1]
üzerinden işaret edilen dizeler argv[argc-1]
program parametrelerini temsil eder.
- Dizinin işaret ettiği parametreler
argc
ve argv
dizeler argv
program tarafından değiştirilebilir ve program başlatma ile program sonlandırılması arasında son kaydedilen değerlerini korur.
10) Böylece, int
olarak tanımlanmış bir typedef adı ile değiştirilebilir int
veya türü ve benzeri argv
yazılabilir
char **argv
.
C99 veya C11'de program sonlandırma
Döndürülen değer main()
, uygulama tanımlı bir şekilde 'çevreye' iletilir.
5.1.2.2.3 Program sonlandırma
1 main
İşlevin dönüş türü uyumlu int
bir türse, ilk çağrıdan main
işleve geri dönüş exit
, main
işlevin bağımsız değişken olarak döndürdüğü değerle işlevin çağrılmasına eşdeğerdir ; 11) işlev }
sona erdirilen
main
değere ulaşmak 0 değerini döndürür. Dönüş türü ile uyumlu değilse int
, ana bilgisayar ortamına döndürülen sonlandırma durumu belirtilmez.
11) 6.2.4'e uygun olarak, otomatik saklama süresine sahip nesnelerin kullanım ömürleri main
, önceki durumda, sonrakinde bulunmadıkları yerlerde bile sona ermiş olacaktır.
Bunun 0
'başarı' olarak zorunlu tutulduğunu unutmayın . İsterseniz EXIT_FAILURE
ve EXIT_SUCCESS
arasından kullanabilirsiniz <stdlib.h>
, ancak 0 iyi kurulmuş ve 1 de olabilir. Ayrıca bkz. 255'ten büyük Çıkış kodları - mümkün mü? .
C89'da (ve dolayısıyla Microsoft C'de), main()
işlev döndürülür ancak bir dönüş değeri belirtmezse ne olacağına dair bir ifade yoktur ; bu nedenle tanımlanmamış davranışa yol açar.
7.22.4.4 exit
İşlev
¶5 Son olarak, kontrol ana bilgisayara geri döndürülür. Değeri status
sıfır veya EXIT_SUCCESS
durum başarılı sonlandırmanın uygulama tanımlı bir formu döndürülür. Değeri: status
ise EXIT_FAILURE
, başarısız sonlandırma durumunun uygulama tanımlı bir formu döndürülür. Aksi takdirde, döndürülen durum uygulama tanımlıdır.
Standart C ++ - Barındırılan Ortam
C ++ 11 standardı (ISO / IEC 14882: 2011) diyor ki:
3.6.1 Ana işlev [basic.start.main]
Program1 Bir program, programın belirlenmiş başlangıcı olan main adlı küresel bir işlev içerecektir. [...]
İmplementation2 Bir uygulama ana işlevi önceden tanımlamamalıdır. Bu işlev aşırı yüklenmemelidir. İnt türünde bir dönüş türüne sahip olacaktır, ancak aksi takdirde türü uygulama olarak tanımlanmıştır. Tüm uygulamalar, aşağıdaki ana tanımların her ikisine de izin verecektir:
int main() { /* ... */ }
ve
int main(int argc, char* argv[]) { /* ... */ }
İkinci formda argc
, programın çalıştırıldığı ortamdan programa iletilen argüman sayısı olacaktır. Eğer argc
bu argümanlar temin edilecektir sıfırdan farklıysa argv[0]
aracılığıyla argv[argc-1]
boş sonlandırılmış baytlı şeritlerinin başlangıç karakterler (NTMBSs) (17.5.2.1.4.2) işaretçiler olarak ve argv[0]
kullanılan adını gösteren bir NTMBS ilk karaktere gösterici olacaktır programı çağırın veya ""
. Değeri argc
negatif olmamalıdır. Değeri argv[argc]
0 olmalıdır. [Not: Sonradan başka (isteğe bağlı) parametrelerin eklenmesi önerilir argv
. —End not]
¶3 Fonksiyon main
bir program dahilinde kullanılmamalıdır. Bağlantısı (3.5) main
uygulama tanımlıdır. [...]
¶5 Bir dönüş ifadesi, ana işlevi terk etme (otomatik saklama süresi olan herhangi bir nesneyi yok etme) ve std::exit
argüman olarak dönüş değeri ile çağırma etkisine sahiptir . Eğer kontrol bir return deyimi ile karşılaşmadan ana sonuna ulaşırsa, etkisi
return 0;
C ++ standardı açıkça "Bu [ana işlev] bir tür dönüş türüne sahip olmalıdır int
, ancak aksi takdirde türü uygulama tanımlıdır" ve seçenek olarak C standardıyla aynı iki imzayı gerektirir. Dolayısıyla, bir 'void main ()' C ++ standardı tarafından doğrudan izin verilmez, ancak alternatif olmayan standart olmayan bir uygulamayı durdurmak için yapabileceği hiçbir şey yoktur. C ++ 'ın kullanıcının aramasını yasakladığını unutmayın main
(ancak C standardı bunu yapmaz).
Bir §18.5 paragraf var başlatma ve sonlandırma §7.22.4.4 Paragraf aynıdır 11 standardına C ++ işlevi C11 standardında (yukarıda belirtildiği gibi) (ayrı bir dipnot gelen, ki sadece dokümanlar ve tanımlandığı gibidir içinde ).exit
EXIT_SUCCESS
EXIT_FAILURE
<cstdlib>
Standart C - Ortak Uzantı
Klasik olarak, Unix sistemleri üçüncü bir varyantı destekler:
int main(int argc, char **argv, char **envp) { ... }
Üçüncü argüman, her biri bir adı, eşittir işareti ve bir değeri (muhtemelen boş) olan bir ortam değişkeni olan dizelere işaret eden boş bir sonlandırılmış listedir. Bunu kullanmazsanız, yine de ' extern char **environ;
' ile çevreye ulaşabilirsiniz . Bu global değişken, POSIX'teki değişkenler arasında benzersizdir, çünkü bunu bildiren bir üstbilgisi yoktur.
Bu, C standardı tarafından Ek J'de belgelenen ortak bir uzantı olarak kabul edilmektedir:
J.5.1 Çevre argümanları
¶1 Barındırılan bir ortamda, ana işlev , her biri programın bu yürütülmesi için ortam hakkında bilgi sağlayan bir dizeye işaret char *envp[]
eden boş bir sonlandırılmış işaretçi dizisine işaret eden üçüncü bir argüman alır char
(5.1. 2.2.1).
Microsoft C
Microsoft VS 2010 derleyici ilginçtir. Web sitesi şöyle diyor:
Main için bildirim sözdizimi:
int main();
veya isteğe bağlı olarak,
int main(int argc, char *argv[], char *envp[]);
Alternatif olarak, main
ve wmain
işlevleri dönen olarak bildirilebilir void
(dönüş değeri yok). Herhangi bir beyanda bulunmuş main
veya wmain
geçersiz olarak geri dönüyorsanız, bir return deyimi kullanarak üst işlem veya işletim sistemine bir çıkış kodu döndüremezsiniz. main
Veya wmain
olarak bildirildiğinde bir çıkış kodu döndürmek void
için exit
işlevi kullanmanız gerekir .
Bir program çıktığında void main()
(MS web sitesi de sessiz olduğunda) ne olacağı (ebeveyn veya işletim sistemine hangi çıkış kodunun döndürüldüğü) net değil .
İlginçtir, MS main()
, C ve C ++ standartlarının gerektirdiği iki argümanlı versiyonunu reçete etmez . Sadece üçüncü argümanın olduğu üç argüman formu char **envp
, çevre değişkenleri listesine bir işaretçi verir.
Microsoft sayfasında ayrıca wmain()
, geniş karakter dizeleri alan bazı alternatifler ve daha fazlası da listelenmektedir .
Bu sayfanın Microsoft Visual Studio 2005 sürümü alternatif olarak listelenmiyor . Sürümleri Microsoft dan Visual Studio 2008 ve sonrası yok.void main()
Standart C - Bağımsız Ortam
Daha önce de 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, standardın söyleyecek çok daha azı vardır. Bağımsız bir ortam için, program başlangıcında çağrılan işlevin çağrılmasına gerek main
yoktur ve dönüş türünde herhangi bir kısıtlama yoktur. Standart diyor ki:
5.1.2 Yürütme ortamları
İki yürütme ortamı tanımlanmıştır: bağımsız ve barındırılan. Her iki durumda da, çalıştırma ortamı tarafından belirlenmiş bir C işlevi çağrıldığında programın başlatılması gerçekleşir. Statik depolama süresine sahip tüm nesneler, program başlatılmadan önce başlatılır (başlangıç değerlerine ayarlanır). Bu tür başlatmanın şekli ve zamanlaması aksi belirtilmemiştir. Program sonlandırma denetimi yürütme ortamına döndürür.
5.1.2.1 Bağımsız ortam
Bağımsız bir ortamda (C programının yürütülmesinin bir işletim sisteminin faydası olmadan gerçekleşebileceği), program başlangıcında çağrılan işlevin adı ve türü uygulama tanımlıdır. Bağımsız bir program tarafından kullanılabilen, 4. maddede belirtilen asgari küme dışında kalan tüm kütüphane olanakları uygulama tarafından tanımlanır.
Bağımsız bir ortamda program sonlandırmanın etkisi uygulama tanımlıdır.
Madde 4 Uygunluğuna yapılan çapraz referans buna atıfta bulunur:
¶5 Kesin olarak uyumlu bir program yalnızca bu Uluslararası Standartta belirtilen dil ve kütüphanenin özelliklerini kullanacaktır. 3) Belirtilmemiş, tanımlanmamış veya uygulama tanımlı davranışlara bağlı olarak çıktı üretemez ve minimum uygulama sınırını aşmaz.
¶6 Uygun iki uygulama biçimi barındırılır ve bağımsızdır . Bir uygun barındırılan uygulama herhangi kesinlikle uygun bir program kabul edecektir. Bir uygun müstakil uygulama kütüphanesi maddesi (madde 7) belirtilen özelliklerinin kullanımı standart başlıklarının içeriğine sınırlı olduğu herhangi kesinlikle uygun programı kabul eder <float.h>
, <iso646.h>
, <limits.h>
, <stdalign.h>
,
<stdarg.h>
, <stdbool.h>
, <stddef.h>
, <stdint.h>
, ve
<stdnoreturn.h>
. Uygun bir uygulama, kesinlikle uygun programların davranışlarını değiştirmedikleri sürece uzantılara (ek kitaplık işlevleri dahil) sahip olabilir. 4)
¶7 Uygun bir program , uygun bir uygulama için kabul edilebilir bir programdır . 5)
3) Kesin olarak uyumlu bir program, kullanımın ilgili makro kullanılarak uygun bir koşullu içerme ön işleme yönergesi ile korunması koşuluyla koşullu özellikleri (bkz. 6.10.8.3) kullanabilir. Örneğin:
#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
/* ... */
fesetround(FE_UPWARD);
/* ... */
#endif
4) Bu, uygun bir uygulamanın, bu Uluslararası Standartta açıkça saklı tutulanlar dışında hiçbir tanımlayıcı ayırmadığı anlamına gelir.
5) Kesinlikle uygun programların, uygun uygulamalar arasında maksimum düzeyde taşınabilir olması amaçlanmıştır. Uygun programlar, uygun bir uygulamanın taşınabilir olmayan özelliklerine bağlı olabilir.
Herhangi bir fonksiyonu tanımlayan bağımsız bir ortam için gereken tek başlığın <stdarg.h>
(ve hatta bunlar sadece makrolar) olduğu dikkat çekicidir .
Standart C ++ - Bağımsız Ortam
C standardının hem barındırılan hem de bağımsız ortamı tanıdığı gibi, C ++ standardı da. (ISO / IEC 14882: 2011'den alıntılar.)
1.4 Uygulama uyumluluğu [intro.compliance]
Kinds7 İki tür uygulama tanımlanmıştır: barındırılan bir uygulama ve bağımsız bir uygulama . Barındırılan bir uygulama için bu Uluslararası Standart, kullanılabilir kitaplıklar kümesini tanımlar. Bağımsız bir uygulama, yürütmenin bir işletim sisteminin faydası olmadan gerçekleştirilebildiği ve belirli bir dil desteği kitaplıklarını içeren uygulama tanımlı bir kütüphane kümesine sahip olduğu uygulamadır (17.6.1.3).
¶8 Uygun bir uygulamanın, iyi biçimlendirilmiş bir programın davranışını değiştirmemesi kaydıyla uzantıları (ek kitaplık işlevleri dahil) olabilir. Bu standarda göre kötü biçimlendirilmiş uzantıları kullanan programları teşhis etmek için uygulamalar gerekmektedir. Ancak bunu yaptıktan sonra, bu tür programları derleyebilir ve yürütebilirler.
İmplementation9 Her uygulama, desteklemediği koşullu olarak desteklenen tüm yapıları tanımlayan ve yerel ayara özgü tüm özellikleri tanımlayan belgeler içermelidir. 3
3) Bu belge aynı zamanda uygulama tanımlı davranışı da tanımlar; bkz. 1.9.
17.6.1.3 Bağımsız uygulamalar [uygunluk]
İki tür uygulama tanımlanmıştır: barındırılan ve bağımsız (1.4). Barındırılan bir uygulama için, bu Uluslararası Standart mevcut üstbilgi kümesini açıklar.
Bağımsız bir uygulamanın, uygulama tanımlı bir üstbilgi kümesi vardır. Bu set en azından Tablo 16'da gösterilen başlıkları içermelidir.
Başlığın sağlanan sürümü <cstdlib>
beyan eder en azından fonksiyonları abort
, atexit
, at_quick_exit
, exit
, vequick_exit
(18.5). Bu tabloda listelenen diğer başlıklar, barındırılan bir uygulama ile aynı gereksinimleri karşılamalıdır.
Tablo 16 - Bağımsız uygulamalar için 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>
int main()
C'de kullanmaya ne dersiniz ?
C11 standardının §5.1.2.2.1 standardı tercih edilen gösterimi gösterir - int main(void)
- ancak standartta aşağıdakileri gösteren iki örnek vardır int main()
: §6.5.3.4 ¶8 ve §6.7.6.3 ¶20 . Şimdi, örneklerin 'normatif' olmadığını belirtmek önemlidir; bunlar sadece açıklayıcıdır. Örneklerde hatalar varsa, standardın ana metnini doğrudan etkilemezler. Bununla birlikte, beklenen davranışın güçlü bir göstergesidir, bu nedenle standart int main()
bir örnekte yer int main()
alıyorsa, tercih edilen gösterim olmasa bile yasak olmadığını gösterir.
6.5.3.4 sizeof
ve _Alignof
operatörleri
...
EX8 ÖRNEK 3 Bu örnekte, değişken uzunluktaki bir dizinin 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;
}