Saya terkadang melihat coders yang digunakan NULL
sebagai 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 NULL
harus diperluas ke (void*) 0
dan 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 NULL
sebagai nilai balik main()
ketika melempar peringatan? Apakah ini hanya gaya pengkodean yang buruk?
- Apa alasan untuk menggunakan
NULL
alih-alih0
sebagai nilai balikmain()
meskipun ada peringatan? - Apakah implementasi ditentukan jika ini sesuai atau tidak dan jika demikian mengapa implementasi apa pun ingin mendapatkan nilai pointer kembali?
EXIT_FAILURE
adalah 8, dan sepertinya menggunakan 1 tidak baik untuk kegagalan karena kadang-kadang digunakan sebagai keberhasilan dalam beberapa program.NULL
pointer sebagai0
(tanpa gips kevoid *
). Dalam hal ini, cacat tidak diketahui dan tidak menghasilkan peringatan. Masih bukan untuk apa NULL digunakan.Jawaban:
Iya.
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
NULL
seharusnya mengacu pada konstanta penunjuk nol , terlepas dari bagaimana penerapannya. Menggunakannya sebagai gantiint
kesalahan logis.Ketidakpedulian. Tidak ada alasan bagus untuk melakukan ini.
Tidak, itu tidak pantas . Terserah implementasi apakah kompiler mengizinkannya . Kompiler C ++ yang sesuai mungkin mengizinkannya tanpa peringatan.
sumber
Ini karena Anda mengkompilasi dengan opsi kompiler longgar. Gunakan pengaturan standar C yang ketat
-std=c11 -pedantic-errors
dan Anda akan mendapatkan kesalahan kompilator yang diharapkan, pada implementasi di manaNULL
meluas ke konstanta penunjuk nol(void*)0
. Lihat masalah “Pointer from integer / integer from pointer without a cast” .Pada implementasi yang
NULL
diperluas0
, kode ini benar-benar sesuai standar, tetapi gaya yang sangat buruk, tidak portabel dan yang paling buruk: omong kosong.Pada C ++ 11 dan seterusnya,
NULL
tidak boleh digunakan - alih-alih gunakannullptr
. Untuk mengembalikannya dari main () tidak benar terlepas.NULL
selalu mengembang0
di C ++ jadi secara tegas itu akan berhasil, tetapi gaya yang sangat buruk dan yang terburuk: omong kosong.Bukan hanya buruk, tetapi gaya pengkodean yang tidak masuk akal tanpa dasar pemikiran apa pun. Programmer yang menulisnya tidak kompeten.
sumber
Lebih buruk. Cara yang benar untuk menunjukkan bahwa program selesai dengan baik adalah
sumber
exit()
(atau nilai balik 0 dari main) berarti sama denganEXIT_SUCCESS
.return
darimain
. Jadi, versi program Anda yang lebih "benar" adalahint main(void){}
;-)Dalam? Beberapa / banyak / semua? Implementasi C ++
NULL
adalah makro yang diperluas ke0
.Ini ketika diperluas berlaku memberi
return 0
. Yang merupakan nilai pengembalian yang valid.Iya.
sumber