Apa tanda tangan yang tepat dari main
fungsi di C ++? Apa jenis pengembalian yang benar, dan apa artinya mengembalikan nilai dari main
? Apa tipe parameter yang diizinkan, dan apa artinya?
Apakah ini khusus sistem? Apakah aturan itu berubah seiring waktu? Apa yang terjadi jika saya melanggar mereka?
main
kembali dalam C dan C ++ .Jawaban:
The
main
Fungsi harus dinyatakan sebagai fungsi non-anggota di namespace global. Ini berarti bahwa itu tidak bisa menjadi fungsi anggota statis atau non-statis kelas, juga tidak dapat ditempatkan di namespace (bahkan namespace yang tidak disebutkan namanya).Nama
main
tidak dicadangkan di C ++ kecuali sebagai fungsi di namespace global. Anda bebas untuk mendeklarasikan entitas lain yang dinamaimain
, termasuk di antaranya, kelas, variabel, enumerasi, fungsi anggota, dan fungsi non-anggota yang tidak ada dalam ruang nama global.Anda bisa mendeklarasikan fungsi yang dinamai
main
sebagai fungsi anggota atau dalam namespace, tetapi fungsi seperti itu tidak akan menjadimain
fungsi yang menentukan di mana program dimulai.The
main
Fungsi tidak dapat dinyatakan sebagaistatic
atauinline
. Itu juga tidak bisa kelebihan beban; hanya ada satu fungsi yang disebutkanmain
dalam namespace global.The
main
Fungsi tidak dapat digunakan dalam program Anda: Anda tidak diizinkan untuk memanggilmain
fungsi dari mana saja di kode Anda, atau apakah Anda diperbolehkan untuk mengambil alamat.Jenis pengembalian
main
harusint
. Tidak ada jenis pengembalian lain yang diizinkan (aturan ini dicetak tebal karena sangat umum untuk melihat program yang salah yang menyatakanmain
dengan jenis pengembalianvoid
; ini mungkin aturan yang paling sering dilanggar mengenaimain
fungsi).Ada dua deklarasi
main
yang harus diizinkan:Dalam (1) , tidak ada parameter.
Dalam (2) , ada dua parameter dan mereka secara konvensional dinamai
argc
danargv
, masing-masing.argv
adalah pointer ke array string C yang mewakili argumen ke program.argc
adalah jumlah argumen dalamargv
array.Biasanya,
argv[0]
berisi nama program, tetapi ini tidak selalu terjadi.argv[argc]
dijamin menjadi null pointer.Perhatikan bahwa karena argumen tipe array (seperti
char*[]
) benar-benar hanya argumen tipe pointer yang menyamar, dua berikut ini adalah cara yang benar untuk menulis (2) dan keduanya memiliki arti yang persis sama:Beberapa implementasi memungkinkan jenis dan jumlah parameter lainnya; Anda harus memeriksa dokumentasi implementasi Anda untuk melihat apa yang didukungnya.
main()
diharapkan mengembalikan nol untuk menunjukkan keberhasilan dan bukan nol untuk menunjukkan kegagalan. Anda tidak diharuskan untuk menulisreturn
pernyataan secara eksplisit dimain()
: jika Anda membiarkanmain()
kembali tanpareturn
pernyataan eksplisit , itu sama seperti jika Anda telah menulisreturn 0;
. Duamain()
fungsi berikut memiliki perilaku yang sama:Ada dua makro,
EXIT_SUCCESS
danEXIT_FAILURE
, yang didefinisikan dalam<cstdlib>
yang juga dapat dikembalikan darimain()
untuk menunjukkan keberhasilan dan kegagalan, masing-masing.Nilai yang dikembalikan oleh
main()
diteruskan keexit()
fungsi, yang mengakhiri program.Perhatikan bahwa semua ini hanya berlaku ketika kompilasi untuk lingkungan yang dihosting (secara informal, lingkungan di mana Anda memiliki perpustakaan standar penuh dan ada OS yang menjalankan program Anda). Dimungkinkan juga untuk mengkompilasi program C ++ untuk lingkungan yang berdiri sendiri (misalnya, beberapa jenis sistem tertanam), di mana startup dan terminasi sepenuhnya ditentukan oleh implementasi dan sebuah
main()
fungsi bahkan mungkin tidak diperlukan. Jika Anda menulis C ++ untuk OS desktop modern, Anda mengkompilasi untuk lingkungan yang dihosting.sumber
Main
harus merupakan fungsi anggota statis karena bahkan tidak memiliki fungsi nonanggota. Bahkan C89main
harus kembaliint
. Saya tidak cukup akrab dengan K&R C untuk mengetahui aturan yang tepat, tetapi saya kira itu juga mengharuskanmain
untuk kembaliint
karenamain
tanpa jenis pengembalian agak umum dan tidak ada tipe = tersiratint
dalam K&R.int
.void
tipe kembali sebagai ekstensi bahasa . Kompiler yang tidak mengizinkannya termasuk GCC dan Comeau.Dari Dokumen standar., 3.6.1.2 Fungsi Utama ,
int main() { / ... / }
danint main(int argc, char* argv[]) { / ... / }
Semoga itu bisa membantu ..
sumber
main
harusint
?void
istirahat model itu. Bahkan tidak masuk akal jika Anda mengatakan itu berarti "selalu menganggap kesuksesan". Karena Anda tidak punya cara untuk mengatakan jika prosesnya benar-benar gagal, jadi apakah Anda benar-benar berhasil? Tidak, kembaliint
.Kata-kata persis dari standar terbaru yang diterbitkan (C ++ 14) adalah:
Ini memperjelas bahwa ejaan alternatif diizinkan selama
main
jenisint()
atau jenis ejaannyaint(int, char**)
. Jadi yang berikut ini juga diizinkan:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
sumber
int main(void)
tidak benar di C ++.auto main() -> int
tidak memiliki tipe pengembalian yang disimpulkan. Perhatikan {in "(auto main () {... tidak diizinkan)" dan tolong pelajari untuk mengetahui kapan Anda belum cukup tahu untuk menambahkan sesuatu yang bermakna.Dua induk yang valid adalah
int main()
danint main(int, char*[])
. Hal lain mungkin dikompilasi atau tidak. Jikamain
tidak secara eksplisit mengembalikan nilai, 0 secara implisit dikembalikan.sumber
main
menjadi batal. Apakah ada alasan khusus bahwa tipe pengembalian utama harus int?int
sebagai tipe pengembalianmain
adalah bahwa nilai ini diserahkan ke shell sebagai kode keluar program, dansh
mengharapkan aint
.void
mereka semua diam. Denganint
kita harus menentukan nilai keluar spesifik untuk setiap pengembalian darimain
.Detail tentang nilai pengembalian dan artinya
Per 3.6.1 (
[basic.start.main]
):Perilaku
std::exit
terperinci di bagian 18.5 ([support.start.term]
), dan menjelaskan kode status:sumber