Son zamanlarda küçük bir C test programı yazmak zorunda kaldım ve bu süreçte, yanlışlıkla vooid
yerine 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 bash
ne 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
standart 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.
main
2 kanonik formdan birine sahip olmalıdır (2.1.2.2). Ancak haklısın @pax, bağımsız bir ortamda, tanımlayıcı main
hiç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.
int main (int argc, char *argv[], char *envp[]);
uyumlu olmasını sağlar ).
int
parametreyle tanımlayarak Tanımsız Davranışı çağırırsınız . Her şey olabilir :)