“İnt main (vooid)”? Bu nasıl çalışıyor?


135

Son zamanlarda küçük bir C test programı yazmak zorunda kaldım ve bu süreçte, yanlışlıkla vooidyerine kullanarak ana işlevde bir yazım hatası yaptım void.

Yine de işe yaradı.

En küçük tam sürümüne indirgeyerek şunu buldum:

int main (vooid) {
    return 42;
}

Bu gerçekten compile ( gcc -Wall -o myprog myprog.c) yapar ve çalıştırıldığında 42 değerini döndürür.

Bu geçerli kod tam olarak nasıl?


İşte bashne yaptığımı göstermek için kabuğumdan kesilmiş ve yapıştırılmış bir transkript :

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

Main öğesini tek bir intparametreyle tanımlayarak Tanımsız Davranışı çağırırsınız . Her şey olabilir :)
pmg

9
Aslında, UB'den emin değilim, @pmg. ISO özellikle mainstandart iki kanonik olandan başka olasılıklara izin verir . Taşınabilirlik için, bu ikisinden birini kullanmalısınız, ancak burada UB'nin geçerli olduğunu düşünmüyorum.
paxdiablo

Hmm: barındırılan bir ortamda main2 kanonik formdan birine sahip olmalıdır (2.1.2.2). Ancak haklısın @pax, bağımsız bir ortamda, tanımlayıcı mainhiçbir şekilde özel değildir: bir işlev olarak kullanılırsa, herhangi bir türde olabilir ve herhangi bir türde herhangi bir sayıda parametreye sahip olabilir.
pmg

2
C99'da, bağımsızlık tamamen uygulama tanımlıdır. Barındırma için, bölüm 5.1.2.2.1 sonunda "veya başka bir uygulama tanımlı şekilde" belirtilir, bu nedenle en azından iki kanonik form gerektirir, ancak başkaları da olabilir (bu UNIXy'nin int main (int argc, char *argv[], char *envp[]);uyumlu olmasını sağlar ).
paxdiablo

Yanıtlar:


220

Basitçe "eski stil" işlev bildirimi sözdizimini kullanıyor; örtük olarak intadlı bir parametreyi bildiriyorsunuzdur vooid.


2
Durum böyle görünüyor. "Vooid = 42; dönüş vooid;" main, ayrıca 42 dönüş değeri alırsınız.
Jeff Ames

43
Aargghh, haklısın. Eğer eklersem -std=c99, anlarım qq.c:1: warning: type of 'vooid' defaults to 'int'.
paxdiablo

70

Geçerli kod, çünkü myprog.c şunları içerir:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooidbir artı iletilen argüman sayısını (ör argc.) içerir. Yani, aslında bütün yaptığın adlandırmak etmektir argciçin vooid.


11
"Dönüş vooid" yaparsanız; bunun yerine, gerçekten 1 + num verir. Args.
Jeff Ames

6
@Jeff, programın adı bir tartışma olarak sayılır, bu nedenle + 1
Martin Beckett

23

C'de, işlev bağımsız değişkeni için varsayılan türdür int. Yani, programınız kelimesini davranıyor vooidolarak int main(int vooid)tamamen geçerli bir koddur.


20

O sadece gcc -std=c89 -Wall -o qq qq.cve gcc -std=gnu89 -Wall -o qq qq.cbir uyarı yaymazlar. Diğer tüm standartlar intiçin örtük tür hakkında bir uyarı verir vooid.

int main(chart)gibi davranır int main (vooid).

return vooid; komut satırı bağımsız değişkenlerinin sayısını döndürür.

Debian test sisteminde gcc 4.4.5 ile test yaptım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.