Saya akan mulai dengan ini: konsistensi adalah raja, keputusan itu kurang penting daripada konsistensi dalam basis kode Anda.
Dalam C ++
NULL didefinisikan sebagai 0 atau 0L dalam C ++.
Jika Anda sudah membaca Bahasa Pemrograman C ++ Bjarne Stroustrup menyarankan menggunakan 0
secara eksplisit untuk menghindari NULL
makro ketika melakukan tugas , saya tidak yakin apakah dia melakukan hal yang sama dengan perbandingan, sudah lama sejak saya membaca buku, saya pikir dia baru saja melakukannya if(some_ptr)
tanpa perbandingan eksplisit tapi saya tidak jelas tentang itu.
Alasan untuk ini adalah bahwa NULL
makro itu menipu (karena hampir semua makro) itu sebenarnya 0
literal, bukan tipe unik seperti namanya. Menghindari makro adalah salah satu pedoman umum dalam C ++. Di sisi lain, 0
tampak seperti bilangan bulat dan tidak bila dibandingkan dengan atau ditugaskan ke pointer. Secara pribadi saya bisa memilih jalan yang lain, tetapi biasanya saya melewatkan perbandingan eksplisit (meskipun beberapa orang tidak suka ini yang mungkin mengapa Anda memiliki kontributor yang menyarankan perubahan).
Terlepas dari perasaan pribadi ini sebagian besar merupakan pilihan yang paling tidak jahat karena tidak ada satu metode yang benar.
Ini jelas dan idiom yang umum dan saya lebih suka, tidak ada kesempatan untuk secara tidak sengaja memberikan nilai selama perbandingan dan itu terbaca dengan jelas:
if(some_ptr){;}
Ini jelas jika Anda tahu itu some_ptr
adalah tipe pointer, tetapi mungkin juga terlihat seperti perbandingan integer:
if(some_ptr != 0){;}
Ini jelas, dalam kasus umum masuk akal ... Tapi ini abstraksi yang bocor, NULL
sebenarnya 0
harfiah dan akhirnya bisa disalahgunakan dengan mudah:
if(some_ptr != NULL){;}
C ++ 0x memiliki nullptr yang sekarang menjadi metode yang disukai karena eksplisit dan akurat, hanya berhati-hati tentang penugasan tak disengaja:
if(some_ptr != nullptr){;}
Sampai Anda dapat bermigrasi ke C ++ 0x saya berpendapat itu buang-buang waktu mengkhawatirkan metode mana yang Anda gunakan, mereka semua tidak cukup itulah sebabnya nullptr ditemukan (bersama dengan masalah pemrograman generik yang muncul dengan penerusan sempurna .) Yang paling penting adalah menjaga konsistensi.
Dalam C
C adalah binatang yang berbeda.
Dalam C NULL dapat didefinisikan sebagai 0 atau sebagai ((batal *) 0), C99 memungkinkan untuk implementasi konstanta penunjuk nol yang ditentukan. Jadi sebenarnya turun ke definisi implementasi NULL dan Anda harus memeriksanya di perpustakaan standar Anda.
Macro sangat umum dan secara umum mereka banyak digunakan untuk menebus kekurangan dalam dukungan pemrograman generik dalam bahasa dan hal-hal lain juga. Bahasanya jauh lebih sederhana dan lebih mengandalkan pre-processor.
Dari perspektif ini saya mungkin akan merekomendasikan menggunakan NULL
definisi makro dalam C.