ฉันจะเริ่มต้นด้วยสิ่งนี้: ความมั่นคงเป็นราชาการตัดสินใจมีความสำคัญน้อยกว่าความมั่นคงในรหัสฐานของคุณ
ใน C ++
NULL ถูกกำหนดเป็น 0 หรือ 0L ใน C ++
หากคุณอ่านภาษา C ++ Bjarne Stroustrup แนะนำให้ใช้0
อย่างชัดเจนเพื่อหลีกเลี่ยงNULL
มาโครเมื่อทำงานที่ได้รับมอบหมายฉันไม่แน่ใจว่าเขาทำแบบเดียวกันกับการเปรียบเทียบหรือไม่เพราะฉันอ่านหนังสือฉันคิดว่าเขาเพิ่งทำไปif(some_ptr)
ไม่มีการเปรียบเทียบที่ชัดเจน แต่ฉันก็คลุมเครือ
สาเหตุของเรื่องนี้คือNULL
มาโครที่หลอกลวง (ตามที่มาโครเกือบทั้งหมด) เป็นจริง0
ตามตัวอักษรไม่ใช่ชนิดที่ไม่ซ้ำเหมือนชื่อที่แนะนำ การหลีกเลี่ยงมาโครเป็นหนึ่งในแนวทางทั่วไปใน C ++ ในทางกลับกัน0
ดูเหมือนว่าจะเป็นจำนวนเต็มและจะไม่เมื่อเทียบกับหรือได้รับมอบหมายให้พอยน์เตอร์ โดยส่วนตัวแล้วฉันสามารถไปได้ทั้งสองทาง แต่โดยทั่วไปฉันจะข้ามการเปรียบเทียบที่ชัดเจน (แม้ว่าบางคนไม่ชอบสิ่งนี้ซึ่งอาจเป็นสาเหตุที่คุณมีผู้สนับสนุนที่แนะนำการเปลี่ยนแปลงต่อไป)
โดยไม่คำนึงถึงความรู้สึกส่วนตัวนี่เป็นทางเลือกที่เลวร้ายที่สุดเนื่องจากไม่มีวิธีการที่ถูกต้อง
นี่เป็นเรื่องชัดเจนและเป็นสำนวนทั่วไปและฉันชอบมันไม่มีโอกาสที่จะกำหนดค่าโดยบังเอิญระหว่างการเปรียบเทียบและอ่านอย่างชัดเจน:
if(some_ptr){;}
สิ่งนี้ชัดเจนถ้าคุณรู้ว่าsome_ptr
เป็นประเภทตัวชี้ แต่มันอาจดูเหมือนการเปรียบเทียบจำนวนเต็ม:
if(some_ptr != 0){;}
นี่คือชัดเจน - ish ในกรณีทั่วไปมันทำให้รู้สึก ... แต่มันเป็นนามธรรมรั่วNULL
จริง ๆ แล้วมันเป็น0
ตัวอักษรและท้ายที่สุดจะถูกนำมาใช้ในทางที่ผิดได้ง่าย:
if(some_ptr != NULL){;}
C ++ 0x มี nullptr ซึ่งตอนนี้เป็นวิธีที่ต้องการเนื่องจากชัดเจนและแม่นยำเพียงระวังการมอบหมายโดยไม่ตั้งใจ:
if(some_ptr != nullptr){;}
จนกว่าคุณจะสามารถโยกย้ายไปยัง C ++ 0x ฉันจะเถียงว่ามันเสียเวลากังวลเกี่ยวกับวิธีการที่คุณใช้วิธีนี้พวกเขาทั้งหมดไม่เพียงพอซึ่งเป็นสาเหตุที่ nullptr ถูกคิดค้น (พร้อมกับปัญหาการเขียนโปรแกรมทั่วไปที่เกิดขึ้นกับการส่งต่อที่สมบูรณ์แบบ .) สิ่งที่สำคัญที่สุดคือการรักษาความมั่นคง
ในซี
C เป็นสัตว์ร้ายที่แตกต่างกัน
ใน C NULL สามารถกำหนดเป็น 0 หรือ ((void *) 0), C99 ช่วยให้การดำเนินการกำหนดค่าคงที่ตัวชี้โมฆะ ดังนั้นจริง ๆ แล้วมาลงความหมายของการใช้ NULL และคุณจะต้องตรวจสอบในไลบรารีมาตรฐานของคุณ
มาโครนั้นเป็นเรื่องที่พบได้ทั่วไปและโดยทั่วไปแล้วพวกเขาก็ใช้มันเป็นจำนวนมากเพื่อชดเชยข้อบกพร่องในการสนับสนุนการเขียนโปรแกรมทั่วไปในภาษาและสิ่งอื่น ๆ เช่นกัน ภาษานั้นง่ายกว่าและพึ่งพาพรีโปรเซสเซอร์มากขึ้น
จากมุมมองนี้ฉันอาจแนะนำให้ใช้NULL
นิยามแมโครใน C