#define คือคำสั่งของตัวประมวลผลล่วงหน้า ดังนั้นเมื่อเรากำหนดมาโครบางตัวโดยใช้ #define มันจะแทนที่โค้ดด้วยค่าของมันก่อนการคอมไพล์ ดังนั้นเมื่อคอมไพเลอร์ไม่รู้อะไรเกี่ยวกับโค้ดเลย ในขณะนั้นค่ามาโครก็จะถูกแทนที่ด้วย
ค่าคงที่เป็นตัวแปรจริงๆ โดยการประกาศตัวแปรนี้ จะใช้หน่วยหน่วยความจำ แต่เราไม่สามารถอัปเดตค่าของตัวแปรชนิดคงที่ได้โดยตรง เราเปลี่ยนได้โดยใช้ค่าพอยน์เตอร์
บางครั้งโปรแกรมเมอร์อาจคิดว่าการใช้มาโครดีกว่า const เนื่องจากไม่ได้ใช้พื้นที่เพิ่มเติมในหน่วยความจำ แต่สำหรับคอมไพเลอร์ที่ดีบางตัว โค้ดที่ได้รับการปรับปรุงจะไม่ส่งผลกระทบ คล้ายกันมาก