Pertanyaan Apa yang harus main () kembali dalam C dan C ++?


Apa cara yang benar (paling efisien) untuk mendefinisikan main() berfungsi dalam C dan C ++ - int main() atau void main() - dan mengapa? Jika int main() kemudian return 1 atau return 0?


Ada banyak duplikat dari pertanyaan ini, termasuk:

Terkait:


549
2017-10-15 12:13


asal


Jawaban:


Nilai pengembalian untuk main harus menunjukkan bagaimana program itu keluar. Keluar normal umumnya diwakili oleh nilai kembali 0 dari main. Pemberhentian abnormal biasanya ditandai dengan pengembalian non-nol tetapi tidak ada standar untuk bagaimana kode non-nol ditafsirkan. Juga sebagaimana dicatat oleh orang lain, void main() secara eksplisit dilarang oleh standar C ++ dan tidak boleh digunakan. C ++ yang valid main tanda tangan adalah:

int main()

dan

int main(int argc, char* argv[])

yang setara dengan

int main(int argc, char** argv)

Ini juga perlu dicatat bahwa dalam C ++, int main() dapat dibiarkan tanpa nilai kembali pada titik mana secara default untuk mengembalikan 0. Ini juga berlaku dengan program C99. Apakah return 0 harus dihilangkan atau tidak terbuka untuk diperdebatkan. Kisaran tanda tangan utama program C yang valid jauh lebih besar.

Juga, efisiensi bukanlah masalah dengan main fungsi. Ini hanya dapat dimasukkan dan dibiarkan begitu saja (menandai permulaan program dan penghentian) sesuai dengan standar C ++. Untuk C, casingnya berbeda dan masuk kembali main() diizinkan, tetapi mungkin harus dihindari.


466
2017-10-15 12:16



Jawaban yang diterima tampaknya ditargetkan untuk C ++, jadi saya pikir saya akan menambahkan jawaban yang berkaitan dengan C, dan ini berbeda dalam beberapa cara.

ISO / IEC 9899: 1989 (C90):

main() harus dinyatakan sebagai:

int main(void)
int main(int argc, char **argv)

Atau setara. Sebagai contoh, int main(int argc, char *argv[]) setara dengan yang kedua. Selanjutnya, int jenis pengembalian dapat dihilangkan karena ini adalah default.

Jika sebuah implementasi mengijinkannya, main() dapat dideklarasikan dengan cara lain, tetapi ini membuat implementasi program didefinisikan, dan tidak lagi secara ketat menyesuaikan.

Standar ini mendefinisikan 3 nilai untuk pengembalian yang benar-benar sesuai (yaitu, tidak bergantung pada perilaku yang ditentukan implementasi): 0 dan EXIT_SUCCESS untuk penghentian yang sukses, dan EXIT_FAILURE untuk penghentian yang gagal. Nilai-nilai lain tidak standar dan implementasi didefinisikan. main() harus memiliki eksplisit return pernyataan di akhir untuk menghindari perilaku tidak terdefinisi.

Akhirnya, tidak ada yang salah dari sudut pandang standar dengan panggilan main()dari sebuah program.

ISO / IEC 9899: 1999 (C99):

Untuk C99, semuanya sama seperti di atas kecuali:

  • Itu int jenis kembalian tidak boleh diabaikan.
  • Anda dapat menghilangkan pernyataan pengembalian dari main(). Jika Anda melakukannya, dan main() selesai, ada yang tersirat return 0.

137
2017-10-16 09:59



Standar C - Lingkungan yang Diinangi

Untuk lingkungan yang dihosting (itulah yang normal), standar C11 (ISO / IEC 9899: 2011) mengatakan:

5.1.2.2.1 Program startup

Fungsi yang disebut saat startup program diberi nama main. Implementasi menyatakan tidak   prototipe untuk fungsi ini. Ini harus didefinisikan dengan jenis kembalinya int dan tanpa   parameter:

int main(void) { /* ... */ }

atau dengan dua parameter (disebut di sini sebagai argc dan argv, meskipun nama apa pun mungkin   digunakan, karena mereka lokal untuk fungsi di mana mereka dinyatakan):

int main(int argc, char *argv[]) { /* ... */ }

atau setara;10) atau dalam beberapa cara lain yang ditentukan oleh implementasi.

Jika dinyatakan, parameter ke fungsi utama harus mematuhi yang berikut ini   kendala:

  • Nilai dari argc harus non-negatif.
  • argv[argc] akan menjadi penunjuk null.
  • Jika nilai argc lebih besar dari nol, anggota array argv[0] melalui    argv[argc-1] inklusif harus berisi pointer ke string, yang diberikan   nilai-nilai yang ditentukan oleh lingkungan host sebelum startup program. Itu   maksudnya adalah memberikan informasi program yang ditentukan sebelum startup program   dari tempat lain di lingkungan yang dihosting. Jika lingkungan host tidak mampu   memasok string dengan huruf dalam huruf besar dan huruf kecil, implementasi   harus memastikan bahwa string diterima dalam huruf kecil.
  • Jika nilai argc lebih besar dari nol, string menunjuk oleh argv[0]   mewakili nama program; argv[0][0] akan menjadi karakter null jika   nama program tidak tersedia dari lingkungan host. Jika nilai argc aku s   lebih besar dari satu, string yang ditunjuk oleh argv[1] melalui argv[argc-1]   mewakili parameter program.
  • Parameter argc dan argv dan string yang ditunjukkan oleh argv array harus   dapat dimodifikasi oleh program, dan mempertahankan nilai terakhir yang disimpan di antara program   startup dan terminasi program.

10) Demikian, int dapat diganti dengan nama typedef yang didefinisikan sebagai int, atau jenis argv dapat ditulis sebagai    char **argv, dan seterusnya.

Berakhirnya program di C99 atau C11

Nilai kembali dari main() ditransmisikan ke 'lingkungan' dalam cara yang ditentukan oleh implementasi.

5.1.2.2.3 Berakhirnya program

1 Jika jenis kembalinya main fungsi adalah tipe yang kompatibel dengan int, kembali dari   panggilan awal ke main fungsi setara dengan memanggil exit berfungsi dengan nilai   dikembalikan oleh main berfungsi sebagai argumennya;11) mencapai } yang mengakhiri    main fungsi mengembalikan nilai 0. Jika jenis kembalinya tidak kompatibel int, yang   status penghentian kembali ke lingkungan host tidak ditentukan.

11)Sesuai dengan 6.2.4, jangka waktu objek dengan durasi penyimpanan otomatis dinyatakan dalam main   akan berakhir dalam kasus pertama, bahkan di mana mereka tidak akan memiliki yang terakhir.

Perhatikan itu 0 dimandatkan sebagai 'sukses'. Kamu dapat memakai EXIT_FAILURE dan EXIT_SUCCESS dari <stdlib.h> jika Anda lebih suka, tetapi 0 sudah mapan, dan begitu juga 1. Lihat juga Keluar kode lebih besar dari 255 - mungkin?.

Di C89 (dan karenanya di Microsoft C), tidak ada pernyataan tentang apa yang terjadi jika main() mengembalikan fungsi tetapi tidak menentukan nilai kembali; karena itu mengarah ke perilaku tidak terdefinisi.

7.22.4.4 The exit fungsi

¶5 Akhirnya, kontrol dikembalikan ke lingkungan host. Jika nilai status adalah nol atau EXIT_SUCCESS, bentuk status yang ditentukan oleh implementasi penghentian sukses dikembalikan. Jika nilai status aku s EXIT_FAILURE, bentuk status yang ditentukan oleh implementasi penghentian yang tidak berhasil dikembalikan. Jika tidak, status yang dikembalikan ditentukan oleh implementasi.

Standar C ++ - Lingkungan yang Di-host

Standar C ++ 11 (ISO / IEC 14882: 2011) mengatakan:

3.6.1 Fungsi utama [basic.start.main]

¶1 Sebuah program harus mengandung fungsi global yang disebut utama, yang merupakan awal program yang ditunjuk. [...]

¶2 Suatu implementasi tidak mendefinisikan fungsi utama. Fungsi ini tidak boleh kelebihan beban. Itu harus   memiliki tipe kembalinya tipe int, tetapi sebaliknya jenisnya adalah implementasi yang ditentukan.   Semua implementasi   akan memungkinkan kedua definisi utama berikut:

int main() { /* ... */ }

dan

int main(int argc, char* argv[]) { /* ... */ }

Dalam bentuk yang terakhir argc adalah jumlah argumen yang dikirimkan ke program dari lingkungan   di mana program dijalankan. Jika argc tidak nol argumen ini harus diberikan argv[0]   melalui argv[argc-1] sebagai penunjuk ke karakter awal string multibyte yang diakhiri null (NTMBSs) (17.5.2.1.4.2) dan argv[0] akan menjadi penunjuk ke karakter awal dari NTMBS yang mewakili   nama yang digunakan untuk menjalankan program atau "". Nilai dari argc harus tidak negatif. Nilai dari argv[argc]   harus 0. [Catatan: Direkomendasikan bahwa parameter lebih lanjut (opsional) ditambahkan setelahnya argv. -akhir   catatan ]

¶3 Fungsi main tidak akan digunakan dalam suatu program. Hubungan (3,5) dari main adalah implementasi yang ditentukan. [...]

¶5 Pernyataan pengembalian di utama memiliki efek meninggalkan fungsi utama (menghancurkan objek apa pun dengan otomatis   durasi penyimpanan) dan panggilan std::exit dengan nilai kembalian sebagai argumen. Jika kontrol mencapai akhir   utama tanpa menghadapi pernyataan kembali, efeknya adalah mengeksekusi

return 0;

Standar C ++ secara eksplisit mengatakan "Ini [fungsi utama] harus memiliki tipe kembalian int, tetapi sebaliknya jenisnya adalah implementasi yang ditentukan ", dan membutuhkan dua tanda tangan yang sama dengan standar C untuk didukung sebagai opsi. Jadi 'void main ()' secara langsung tidak diizinkan oleh standar C ++, meskipun tidak ada yang dapat dilakukan untuk menghentikan penerapan non-standar yang memungkinkan alternatif. Perhatikan bahwa C + + melarang pengguna untuk menelepon main(tetapi standar C tidak).

Ada paragraf §18.5 Mulai dan penghentian dalam standar C ++ 11 yang identik dengan paragraf dari §7.22.4.4 Itu exit fungsi dalam standar C11 (dikutip di atas), selain dari catatan kaki (yang hanya mendokumentasikan itu EXIT_SUCCESS dan EXIT_FAILURE didefinisikan dalam <cstdlib>).

Standar C - Perpanjangan Umum

Secara klasik, sistem Unix mendukung varian ketiga:

int main(int argc, char **argv, char **envp) { ... }

Argumen ketiga adalah daftar nol yang diakhiri dari pointer ke string, masing-masing merupakan variabel lingkungan yang memiliki nama, tanda sama dengan, dan nilai (mungkin kosong). Jika Anda tidak menggunakan ini, Anda masih bisa mendapatkan lingkungan melalui 'extern char **environ;'. Untuk waktu yang lama, itu tidak memiliki header yang menyatakan itu, tetapi POSIX Standar 2008 sekarang mengharuskannya untuk dideklarasikan di <unistd.h>.

Ini diakui oleh standar C sebagai ekstensi umum, didokumentasikan dalam Lampiran J:

J.5.1 Argumen lingkungan

¶1 Dalam lingkungan yang dihosting, fungsi utama menerima argumen ketiga, char *envp[],   yang menunjuk ke array pointer yang diakhiri null char, yang masing-masing menunjuk ke string   yang memberikan informasi tentang lingkungan untuk pelaksanaan program ini (5.1.2.2.1).

Microsoft C

Itu Microsoft VS 2010 compiler menarik. Situs web mengatakan:

Sintaks pernyataan untuk main adalah

 int main();

atau, secara opsional,

int main(int argc, char *argv[], char *envp[]);

Atau, itu main dan wmain fungsi dapat dinyatakan kembali void (tidak ada nilai kembali). Jika Anda menyatakan main atau wmain sebagai kembali batal, Anda tidak dapat mengembalikan kode keluar ke proses induk atau sistem operasi dengan menggunakan pernyataan pengembalian. Untuk mengembalikan kode keluar kapan main atau wmain dinyatakan sebagai void, Anda harus menggunakan exit fungsi.

Tidak jelas bagi saya apa yang terjadi (apa kode keluar dikembalikan ke induk atau OS) ketika sebuah program dengan void main() tidak keluar - dan situs web MS juga diam.

Menariknya, MS tidak meresepkan versi dua argumen main() bahwa standar C dan C ++ membutuhkan. Ini hanya mengatur tiga bentuk argumen di mana argumen ketiga adalah char **envp, penunjuk ke daftar variabel lingkungan.

Halaman Microsoft juga mencantumkan beberapa alternatif lain - wmain() yang mengambil string karakter yang luas, dan beberapa lagi.

Microsoft Visual Studio 2005 versi dari halaman ini tidak terdaftar void main() sebagai alternatif. Itu versi dari Microsoft Visual Studio 2008 seterusnya lakukan.

Standar C - Lingkungan Berdiri Bebas

Seperti yang disebutkan sebelumnya, persyaratan di atas berlaku untuk lingkungan yang dihosting. Jika Anda bekerja dengan lingkungan freestanding (yang merupakan alternatif untuk lingkungan yang di-host), maka standar memiliki lebih sedikit untuk dikatakan. Untuk lingkungan berdiri bebas, fungsi yang disebut saat startup program tidak perlu dipanggil main dan tidak ada batasan pada jenis kembalinya. Standar mengatakan:

5.1.2 Lingkungan eksekusi

Dua lingkungan eksekusi didefinisikan: berdiri bebas dan dihosting. Dalam kedua kasus,   startup program terjadi ketika fungsi C yang ditunjuk dipanggil oleh eksekusi   lingkungan Hidup. Semua objek dengan durasi penyimpanan statis harus diinisialisasi (ditetapkan ke nilai awalnya) sebelum memulai program. Cara dan waktu inisialisasi tersebut dinyatakan tidak spesifik. Pemutusan program mengembalikan kontrol ke lingkungan eksekusi.

5.1.2.1 Lingkungan freestanding

Di lingkungan yang berdiri bebas (di mana eksekusi program C dapat terjadi tanpa ada manfaat dari sistem operasi), nama dan jenis fungsi yang disebut saat startup program ditentukan oleh implementasi. Fasilitas perpustakaan apa pun yang tersedia untuk program freestanding, selain dari set minimal yang disyaratkan oleh klausul 4, adalah implementasi yang ditentukan.

Efek penghentian program dalam lingkungan freestanding adalah implementasi yang ditentukan.

Referensi silang untuk klausul 4 Kesesuaian mengacu pada ini:

¶5 A program ketat sesuai hanya akan menggunakan fitur-fitur bahasa dan pustaka yang ditentukan dalam Standar Internasional ini.3) Ini tidak akan menghasilkan output tergantung pada perilaku yang tidak ditentukan, tidak terdefinisi, atau implementasi yang ditentukan, dan tidak akan melebihi batas implementasi minimum.

¶6 Kedua bentuk implementasi yang sesuai adalah dihosting dan berdiri bebas. SEBUAH sesuai dengan implementasi yang di-hosting akan menerima program yang benar-benar sesuai. SEBUAH menyesuaikan implementasi freestanding akan menerima program yang benar-benar sesuai di mana penggunaan fitur yang ditentukan dalam klausa perpustakaan (ayat 7) terbatas pada isi dari header standar <float.h>, <iso646.h>, <limits.h>, <stdalign.h>,    <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, dan    <stdnoreturn.h>. Implementasi yang sesuai mungkin memiliki ekstensi (termasuk   fungsi perpustakaan tambahan), asalkan mereka tidak mengubah perilaku dari setiap program ketat sesuai.4)

¶7 A program yang sesuai adalah salah satu yang dapat diterima untuk implementasi yang sesuai.5)

3) Program yang benar-benar sesuai dapat menggunakan fitur bersyarat (lihat 6.10.8.3) asalkan penggunaannya dijaga oleh instruksi preprocessing bersyarat inklusi yang tepat menggunakan makro terkait. Sebagai contoh:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

4) Ini menyiratkan bahwa penerapan yang sesuai tidak memiliki pengidentifikasi selain yang secara eksplisit dicadangkan dalam Standar Internasional ini.

5) Program yang benar-benar sesuai dimaksudkan agar sangat portabel di antara penerapan yang sesuai. Program yang sesuai dapat bergantung pada fitur non-portabel dari implementasi yang sesuai.

Terlihat bahwa satu-satunya tajuk yang diperlukan dari lingkungan berdiri bebas yang benar-benar mendefinisikan fungsi apa pun <stdarg.h> (dan bahkan mereka mungkin - dan sering - hanya macro).

Standar C ++ - Lingkungan Bebas

Sama seperti standar C mengakui baik lingkungan host dan freestanding, demikian juga standar C ++. (Kutipan dari ISO / IEC 14882: 2011.)

1.4 Pelaksanaan kepatuhan [intro.compliance]

¶7 Dua jenis implementasi didefinisikan: a implementasi yang di-hosting dan a penerapan freestanding. Untuk implementasi yang di-host, Standar Internasional ini menetapkan kumpulan pustaka yang tersedia. A berdiri bebas   implementasi adalah salah satu di mana eksekusi dapat terjadi tanpa manfaat dari sistem operasi, dan memiliki satu set perpustakaan yang diimplementasikan yang termasuk perpustakaan dukungan bahasa tertentu (17.6.1.3).

¶8 Implementasi yang sesuai mungkin memiliki ekstensi (termasuk fungsi pustaka tambahan), asalkan mereka tidak mengubah perilaku program yang terbentuk dengan baik. Implementasi diperlukan untuk mendiagnosis program itu   gunakan ekstensi semacam itu yang tidak sesuai dengan Standar Internasional ini. Setelah melakukannya, mereka dapat mengkompilasi dan menjalankan program-program tersebut.

¶9 Setiap implementasi harus mencakup dokumentasi yang mengidentifikasi semua konstruksi yang didukung secara kondisional yang tidak mendukung dan mendefinisikan semua karakteristik spesifik lokal.3

3) Dokumentasi ini juga mendefinisikan perilaku yang ditentukan oleh implementasi; lihat 1.9.

17.6.1.3 Penerapan freestanding [kepatuhan]

Dua jenis implementasi didefinisikan: hosted dan freestanding (1.4). Untuk implementasi yang di-hosting, Standar Internasional ini menjelaskan kumpulan header yang tersedia.

Implementasi freestanding memiliki kumpulan header yang ditentukan oleh implementasi. Set ini harus mencakup setidaknya header yang ditunjukkan pada Tabel 16.

Versi header yang disediakan <cstdlib> harus menyatakan setidaknya fungsi abort, atexit, at_quick_exit, exit, dan quick_exit (18,5). Header lain yang tercantum dalam tabel ini harus memenuhi persyaratan yang sama seperti untuk implementasi yang di-host.

Tabel 16 - C ++ header untuk implementasi freestanding

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>

Bagaimana dengan menggunakan int main() di C?

Standar §5.1.2.2.1 standar C11 menunjukkan notasi yang disukai -int main(void) - tetapi ada juga dua contoh dalam standar yang ditampilkan int main(): §6.5.3.4 ¶8 dan §6.7.6.3 ¶20. Sekarang, penting untuk dicatat bahwa contoh tidak 'normatif'; mereka hanya ilustratif. Jika ada bug dalam contoh, mereka tidak secara langsung mempengaruhi teks utama standar. Yang mengatakan, mereka sangat menunjukkan perilaku yang diharapkan, jadi jika standar termasuk int main() dalam contoh, itu menunjukkan itu int main() tidak dilarang, bahkan jika itu bukan notasi yang disukai.

6.5.3.4 sizeof dan _Alignof operator

...

¶8 CONTOH 3 Dalam contoh ini, ukuran array panjang variabel dihitung dan dikembalikan dari fungsi:

#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;
}

98
2017-09-10 14:15



aku percaya itu main() harus kembali baik EXIT_SUCCESS atau EXIT_FAILURE. Mereka didefinisikan dalam stdlib.h


56
2017-10-15 12:33



Kembalikan 0 pada keberhasilan dan bukan nol untuk kesalahan. Ini adalah standar yang digunakan oleh UNIX dan DOS scripting untuk mencari tahu apa yang terjadi dengan program Anda.


27
2017-10-15 12:16



Perhatikan bahwa standar C dan C ++ mendefinisikan dua jenis implementasi: berdiri bebas dan dihosting.

  • Lingkungan host C90

    Formulir yang diizinkan 1:

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    Komentar:

    Mantan dua secara eksplisit dinyatakan sebagai bentuk yang diizinkan, yang lain secara implisit diizinkan karena C90 diperbolehkan "implit int" untuk jenis dan fungsi parameter kembali. Tidak ada bentuk lain yang diizinkan.

  • C90 freestanding environment

    Setiap bentuk atau nama utama diperbolehkan 2.

  • Lingkungan host C99

    Formulir yang diizinkan 3:

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    

    Komentar:

    C99 dihapus "implit int" main() tidak lagi berlaku.

    Sebuah kalimat ambigu yang aneh "atau dalam beberapa cara lain yang ditentukan oleh implementasi" telah diperkenalkan. Ini dapat diartikan sebagai "parameter ke int main() dapat bervariasi "atau sebagai" utama dapat memiliki bentuk implementasi yang ditentukan ".

    Beberapa kompiler telah memilih untuk menafsirkan standar dengan cara yang terakhir. Dapat dibilang, seseorang tidak dapat dengan mudah menyatakan bahwa mereka tidak benar-benar menyesuaikan diri dengan mengutip standar itu sendiri, karena itu ambigu.

    Namun, untuk memungkinkan bentuk liar sepenuhnya main() mungkin (?) bukan maksud dari kalimat baru ini. Alasan C99 (tidak normatif) menyiratkan bahwa kalimat mengacu pada parameter tambahan int main  4.

    Namun bagian untuk penghentian program lingkungan host kemudian melanjutkan berdebat tentang kasus di mana utama tidak kembali int 5. Meskipun bagian itu tidak normatif untuk bagaimana utama harus dideklarasikan, itu pasti menyiratkan bahwa main mungkin dideklarasikan dengan cara yang sepenuhnya ditentukan oleh implementasi bahkan pada sistem yang di-host.

  • C99 freestanding environment

    Setiap bentuk atau nama utama diperbolehkan 6.

  • Lingkungan host C11

    Formulir yang diizinkan 7:

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    
  • C11 freestanding environment

    Setiap bentuk atau nama utama diperbolehkan 8.


Perhatikan itu int main() tidak pernah terdaftar sebagai formulir yang valid untuk setiap penerapan C di mana pun dari versi di atas. Di C, tidak seperti C ++, () dan (void) memiliki arti yang berbeda. Yang pertama adalah fitur usang yang dapat dihapus dari bahasa. Lihat arah bahasa C11 di masa mendatang:

6.11.6 Deklarator fungsi

Penggunaan deklarator fungsi dengan tanda kurung kosong (bukan deklarator tipe parameter prototipe-format) adalah fitur usang.


  • Lingkungan host C ++ 03

    Formulir yang diizinkan 9:

    int main ()
    int main (int argc, char *argv[])
    

    Komentar:

    Perhatikan tanda kurung yang kosong dalam formulir pertama. C ++ dan C berbeda dalam hal ini, karena dalam C ++ ini berarti bahwa fungsi tidak mengambil parameter. Tetapi dalam C itu berarti bahwa itu mungkin mengambil parameter apa pun.

  • C ++ 03 lingkungan berdiri bebas

    Nama fungsi yang disebut saat startup adalah implementasi yang ditentukan. Jika diberi nama main() itu harus mengikuti formulir yang disebutkan 10:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    
  • C + + 11 lingkungan yang dihosting

    Formulir yang diizinkan 11:

    int main ()
    int main (int argc, char *argv[])
    

    Komentar:

    Teks standar telah diubah tetapi memiliki arti yang sama.

  • C + + 11 lingkungan berdiri bebas

    Nama fungsi yang disebut saat startup adalah implementasi yang ditentukan. Jika diberi nama main() itu harus mengikuti formulir yang disebutkan 12:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

Referensi

  1. ANSI X3.159-1989 2.1.2.2 Lingkungan yang dihosting. "Program startup"

    Fungsi yang disebut saat startup program disebut utama. Itu   implementasi menyatakan tidak ada prototipe untuk fungsi ini. Itu harus   didefinisikan dengan jenis kembali int dan tanpa parameter:

    int main(void) { /* ... */ } 
    

    atau dengan dua parameter (disebut di sini sebagai   argc dan argv, meskipun nama apa pun dapat digunakan, karena mereka bersifat lokal ke   fungsi di mana mereka dinyatakan):

    int main(int argc, char *argv[]) { /* ... */ }
    
  2. ANSI X3.159-1989 2.1.2.1 Lingkungan berdiri bebas:

    Dalam lingkungan yang berdiri bebas (di mana eksekusi program C dapat mengambil   tempat tanpa manfaat dari sistem operasi), nama dan jenisnya   dari fungsi yang disebut saat startup program adalah implementasi yang ditentukan.

  3. ISO 9899: 1999 5.1.2.2 Lingkungan host -> 5.1.2.2.1 Program startup

    Fungsi yang disebut saat startup program disebut utama. Itu   implementasi menyatakan tidak ada prototipe untuk fungsi ini. Itu harus   didefinisikan dengan jenis kembali int dan tanpa parameter:

    int main(void) { /* ... */ } 
    

    atau dengan dua parameter (disebut di sini sebagai   argc dan argv, meskipun nama apa pun dapat digunakan, karena mereka bersifat lokal ke   fungsi di mana mereka dinyatakan):

    int main(int argc, char *argv[]) { /* ... */ }
    

    atau setara; 9) atau dalam beberapa implementasi lain yang ditentukan   cara.

  4. Dasar Pemikiran untuk Standar Internasional - Bahasa Pemrograman - C, Revisi 5.10. 5.1.2.2 Lingkungan host -> 5.1.2.2.1 Program startup

    Perilaku argumen ke utama, dan interaksi keluar, utama dan atexit   (lihat §7.20.4.2) telah dikodifikasi untuk mengekang beberapa variasi yang tidak diinginkan dalam representasi argv   string, dan dalam arti nilai dikembalikan oleh main.

    Spesifikasi argc dan argv sebagai argumen utama mengakui praktik sebelumnya yang ekstensif.   argv [argc] diperlukan untuk menjadi pointer null untuk menyediakan pemeriksaan yang berlebihan untuk akhir daftar, juga atas dasar praktik umum.

    main adalah satu-satunya fungsi yang dapat secara mudah dinyatakan dengan nol atau dua argumen. (Jumlah argumen fungsi lain harus sama persis antara permintaan dan definisi.)   Kasus khusus ini hanya mengakui praktik yang tersebar luas dari meninggalkan argumen ke utama ketika program tidak mengakses string argumen program. Sementara banyak implementasi mendukung lebih dari dua argumen ke utama, praktik semacam itu tidak diberkati atau dilarang oleh Standar; sebuah program yang mendefinisikan utama dengan tiga argumen tidak sepenuhnya sesuai (lihat §J.5.1.).

  5. ISO 9899: 1999 5.1.2.2 Lingkungan yang dihosting -> 5.1.2.2.3 Pengakhiran program

    Jika jenis kembalian dari fungsi utama adalah tipe yang kompatibel dengan int, kembalinya dari panggilan awal ke fungsi utama sama dengan memanggil fungsi keluar dengan nilai yang dikembalikan oleh fungsi utama sebagai argumennya; 11) mencapai } yang mengakhiri fungsi utama mengembalikan nilai 0. Jika jenis kembalinya tidak kompatibel dengan int, status pengakhiran dikembalikan ke lingkungan host tidak ditentukan.

  6. ISO 9899: 1999 5.1.2.1 Lingkungan freestanding

    Di lingkungan yang berdiri bebas (di mana eksekusi program C dapat terjadi tanpa ada manfaat dari sistem operasi), nama dan jenis fungsi yang disebut saat startup program ditentukan oleh implementasi.

  7. ISO 9899: 2011 5.1.2.2 Lingkungan host -> 5.1.2.2.1 Program startup

    Bagian ini identik dengan C99 yang dikutip di atas.

  8. ISO 9899: 1999 5.1.2.1 Lingkungan freestanding

    Bagian ini identik dengan C99 yang dikutip di atas.

  9. ISO 14882: 2003 3.6.1 Fungsi utama

    Suatu implementasi tidak menentukan fungsi utama. Fungsi ini tidak boleh kelebihan beban. Ini harus memiliki tipe kembalinya tipe int, tetapi sebaliknya jenisnya adalah implementasi yang ditentukan. Semua implementasi harus memungkinkan kedua definisi utama berikut:

    int main() { /* ... */ }
    

    dan

    int main(int argc, char* argv[]) { /* ... */ }
    
  10. ISO 14882: 2003 3.6.1 Fungsi utama

    Ini adalah implementasi-didefinisikan apakah suatu program dalam lingkungan freestanding diperlukan untuk mendefinisikan fungsi utama.

  11. ISO 14882: 2011 3.6.1 Fungsi utama

    Suatu implementasi tidak menentukan fungsi utama. Fungsi ini tidak boleh kelebihan beban. Ini harus memiliki tipe kembalinya tipe int, tetapi sebaliknya jenisnya adalah implementasi yang ditentukan. Semua implementasi harus   izinkan keduanya

    - fungsi dari () mengembalikan int dan

    - fungsi dari (int, pointer ke pointer ke char) kembali int

    sebagai tipe utama (8.3.5).

  12. ISO 14882: 2011 3.6.1 Fungsi utama

    Bagian ini identik dengan C ++ 03 yang dikutip di atas.


25
2017-07-07 08:07



Perlu diingat bahwa, meskipun Anda mengembalikan int, beberapa OS (Windows) memotong nilai yang dikembalikan ke satu byte (0-255).


7
2017-10-15 15:22