Mengapa mengembalikan NULL dari main ()?


10

Saya terkadang melihat coders yang digunakan NULLsebagai nilai balik main()dalam program C dan C ++, misalnya sesuatu seperti itu:

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

Ketika saya mengkompilasi kode `ini dengan gcc saya mendapat peringatan:

peringatan: return membuat integer dari pointer tanpa gips [-Wint-conversion]

yang wajar karena makro NULLharus diperluas ke (void*) 0dan nilai pengembalian utama harus bertipe int.

Ketika saya membuat program C ++ singkat:

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

Dan kompilasi dengan g ++, saya mendapatkan peringatan yang setara:

peringatan: mengonversi ke tipe 'int' non-pointer dari NULL [-Wconversion-null]

Tapi mengapa mereka gunakan NULLsebagai nilai balik main()ketika melempar peringatan? Apakah ini hanya gaya pengkodean yang buruk?


  • Apa alasan untuk menggunakan NULLalih-alih 0sebagai nilai balik main()meskipun ada peringatan?
  • Apakah implementasi ditentukan jika ini sesuai atau tidak dan jika demikian mengapa implementasi apa pun ingin mendapatkan nilai pointer kembali?

4
Anda harus bertanya langsung kepada mereka.
juanchopanza

5
"mengapa mereka menggunakan NULL sebagai nilai pengembalian main ()" - kami tidak. Penulis kode itu. Saya tertarik mendengar upaya mereka membenarkan alasannya.
WhozCraig

1
@Vlad dari Moskow ya tapi saya harus memeriksa apakah benar-benar 0. ^^ - EXIT_FAILUREadalah 8, dan sepertinya menggunakan 1 tidak baik untuk kegagalan karena kadang-kadang digunakan sebagai keberhasilan dalam beberapa program.
Waelmio

2
@RobertSsupportsMonicaCellio jika itu benar-benar respons yang Anda dapatkan, itu agak menyedihkan. Pertama, itu tidak masuk akal (akan lebih masuk akal jika itu ada di mana - mana daripada di mana saja ). Kedua, ini adalah penjualan habis. Jika Anda menulis kode, Anda sebaiknya memiliki kompas yang baik tentang apakah itu benar; tidak hanya mengikuti saja karena itulah yang tampaknya dilakukan oleh ... seseorang. Anda sepertinya memiliki jarum yang menunjuk ke arah yang benar (jadi mengapa Anda bertanya); tidak begitu banyak orang yang menulis kode itu, lalu memberi Anda jawaban itu sebagai alasan mengapa.
WhozCraig

2
Dalam c, sangat valid untuk mendefinisikan NULLpointer sebagai 0(tanpa gips ke void *). Dalam hal ini, cacat tidak diketahui dan tidak menghasilkan peringatan. Masih bukan untuk apa NULL digunakan.
Ctx

Jawaban:


14

itu masuk akal

Iya.

karena makro NULLharus diperluas ke(void*) 0

Tidak. Di C ++ makro NULL tidak boleh diperluas ke (void*) 0[support.types.nullptr]. Ini hanya dapat dilakukan dalam C.

Either way, menulis kode seperti ini menyesatkan karena NULLseharusnya mengacu pada konstanta penunjuk nol , terlepas dari bagaimana penerapannya. Menggunakannya sebagai ganti intkesalahan logis.

  • Apa alasan untuk menggunakan NULLbukannya 0 sebagai nilai balik main()meskipun ada peringatan?

Ketidakpedulian. Tidak ada alasan bagus untuk melakukan ini.

  • Apakah implementasi ditentukan jika ini sesuai atau tidak dan jika demikian mengapa implementasi apa pun ingin mendapatkan nilai pointer kembali?

Tidak, itu tidak pantas . Terserah implementasi apakah kompiler mengizinkannya . Kompiler C ++ yang sesuai mungkin mengizinkannya tanpa peringatan.


1
Bukaku yang biasa: itu bukan implementaiton-defined apakah kompiler mengizinkannya; ini khusus implementasi . Dalam standar, "implemenation-defined" berarti bahwa implementasi harus mendokumentasikan apa yang dilakukannya.
Pete Becker

@PeteBecker Saya berhenti ketika menulis tetapi melanjutkan saja (karena "implementasi-spesifik" dan frasa serupa hanya terdengar tidak wajar). Tapi kau benar, aku akan mengubahnya.
Konrad Rudolph

Menurut saya, satu-satunya alasan "didefinisikan oleh implementasi" terdengar alami adalah bahwa orang terbiasa melihatnya disalahgunakan. <g>
Pete Becker

8

Ketika saya mengkompilasi kode `ini dengan gcc saya mendapat peringatan:

warning: return makes integer from pointer without a cast

Ini karena Anda mengkompilasi dengan opsi kompiler longgar. Gunakan pengaturan standar C yang ketat -std=c11 -pedantic-errorsdan Anda akan mendapatkan kesalahan kompilator yang diharapkan, pada implementasi di mana NULLmeluas ke konstanta penunjuk nol (void*)0. Lihat masalah “Pointer from integer / integer from pointer without a cast” .

Pada implementasi yang NULLdiperluas 0, kode ini benar-benar sesuai standar, tetapi gaya yang sangat buruk, tidak portabel dan yang paling buruk: omong kosong.

Dan kompilasi dengan g ++, saya mendapatkan peringatan yang setara:

warning: converting to non-pointer type int from NULL [-Wconversion-null]

Pada C ++ 11 dan seterusnya, NULLtidak boleh digunakan - alih-alih gunakan nullptr. Untuk mengembalikannya dari main () tidak benar terlepas. NULLselalu mengembang 0di C ++ jadi secara tegas itu akan berhasil, tetapi gaya yang sangat buruk dan yang terburuk: omong kosong.

Apakah ini hanya gaya pengkodean yang buruk?

Bukan hanya buruk, tetapi gaya pengkodean yang tidak masuk akal tanpa dasar pemikiran apa pun. Programmer yang menulisnya tidak kompeten.


2

Apakah ini hanya gaya pengkodean yang buruk?

Lebih buruk. Cara yang benar untuk menunjukkan bahwa program selesai dengan baik adalah

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
Itu adalah ilmu yang murni. Menurut standar C, argumen 0 ke exit()(atau nilai balik 0 dari main) berarti sama dengan EXIT_SUCCESS.
Mosvy

Dan karena c99 Anda bisa menghilangkan returndari main. Jadi, versi program Anda yang lebih "benar" adalah int main(void){};-)
mosvy

1

Dalam? Beberapa / banyak / semua? Implementasi C ++ NULLadalah makro yang diperluas ke 0.

Ini ketika diperluas berlaku memberi return 0. Yang merupakan nilai pengembalian yang valid.

Apakah ini hanya gaya pengkodean yang buruk?

Iya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.