Saya baru-baru mengetikkan program uji C kecil dan, dalam proses, saya membuat kesalahan ejaan dalam fungsi utama dengan sengaja menggunakan vooid
bukan void
.
Namun itu masih berhasil.
Mengurangi itu menjadi versi lengkap terkecil, saya berakhir dengan:
int main (vooid) {
return 42;
}
Ini memang compile ( gcc -Wall -o myprog myprog.c
) dan, ketika dijalankan, mengembalikan 42.
Bagaimana sebenarnya kode yang valid ini?
Ini transkrip yang dipotong dan ditempel dari bash
cangkang saya untuk menunjukkan apa yang saya lakukan:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
int
parameter, Anda memanggil Undefined Behavior . Apa pun bisa terjadi :)main
dua standar kanonik. Untuk portabilitas, Anda harus menggunakan salah satu dari keduanya tetapi menurut saya UB tidak berlaku di sini.main
harus memiliki salah satu dari 2 bentuk kanonis (2.1.2.2). Tapi Anda benar @pax, dalam lingkungan yang berdiri sendiri, pengenalmain
sama sekali tidak istimewa: jika digunakan sebagai fungsi , pengenal dapat berupa jenis apa pun dan memiliki sejumlah parameter jenis apa pun.int main (int argc, char *argv[], char *envp[]);
untuk menyesuaikan ).Jawaban:
Ini hanya menggunakan sintaks deklarasi fungsi "gaya lama"; Anda secara implisit mendeklarasikan
int
parameter yang dipanggilvooid
.sumber
-std=c99
, saya mengertiqq.c:1: warning: type of 'vooid' defaults to 'int'
.Ini kode yang valid, karena myprog.c berisi:
int main (vooid) // vooid is of type int, allowed, and an alias for argc { return 42; // The answer to the Ultimate Question }
vooid
berisi satu ditambah jumlah argumen yang diteruskan (yaitu,argc
). Jadi, pada dasarnya semua yang Anda lakukan adalah mengganti namaargc
menjadivooid
.sumber
Di C, tipe default untuk argumen fungsi adalah
int
. Jadi, program Anda memperlakukan kata tersebutvooid
sebagaiint main(int vooid)
, yang merupakan kode yang benar-benar valid.sumber
Itu hanya
gcc -std=c89 -Wall -o qq qq.c
dangcc -std=gnu89 -Wall -o qq qq.c
tidak mengeluarkan peringatan. Semua standar lainnya mengeluarkan peringatan tentang tipe implisitint
untukvooid
.int main(chart)
berperilaku seperti ituint main (vooid)
.return vooid;
mengembalikan jumlah argumen baris perintah.Saya menguji dengan gcc 4.4.5 pada sistem pengujian Debian.
sumber