সি প্রোগ্রামিং-এ কনস্টান্ট মান সংজ্ঞায়িত করার দুটি পদ্ধতি রয়েছে: #define (প্রিপ্রসেসর ম্যাক্রো) এবং const কীওয়ার্ড। যেসব সতহে আউটপুট একই দেখতে পারে, তবে তাদের কাজ করার পদ্ধতি এবং কম্পাইলার্সের দৃষ্টিতে বড় পার্থক্য রয়েছে।
#define (প্রিপ্রসেসর ডাইরেক্টিভ)
- প্রিপ্রসেসর стаেজে টেক্সট সাবস্টিটিউশন করে
- কম্পাইলার কখনোই ম্যাক্রোর নাম দেখে না — শুধু মান দেখে
- মেমরি অকুপায় করে না (ভেরিয়েবল নয়)
- টাইপ চেকিং নেই — শুধু টেক্সট রিপ্লেসমেন্ট
- স্কোপ নিয়ম মানেনা (ফাইল স্কোপ বা ব্লক স্কোপ নেই)
const (কনস্ট্যান্ট ভেরিয়েবল)
- এটি একটি আসল ভেরিয়েবল — মেমরি অকুপায় করে
- কম্পাইলার টাইপ চেকিং করে
- স্কোপ নিয়ম মানى (ব্লক স্কোপ, ফাইল স্কোপ)
- ডিবাগারে দেখতে পাওয়া যায় (সিম্বল টেবিলে থাকে)
- পয়েন্টার দিয়ে কাস্ট করে মান পরিবর্তন করা সম্ভব (যদিওUndefined Behavior)
তুলনা
#define PI 3.14159 // ম্যাক্রো — টেক্সট রিপ্লেসমেন্ট
const double PI = 3.14159; // কনস্ট ভেরিয়েবল — টাইপ সেফ
অপ্টিমাইজেশন নোট
আধুনিক অপ্টিমাইজিং কম্পাইলার (GCC -O2, Clang, MSVC) const ভেরিয়েবলকে কনস্টান্ট প্রোপাগেশন দিয়ে সরাসরি কোডে ইম্বেড করে দেয়। তাই মেমরি ও পারফরম্যান্সে কোনো প্রায়োগিক পার্থক্য থাকে না।
সুপারিশ
- প্রाथমিকতা দিন
const/constexpr(C++)-কে — টাইপ সেফটি, ডিবাগিং, স্কোপিং #defineশুধু তখন ব্যবহার করুন যখন প্রিপ্রসেসর-লেভেল ম্যানিপুলেশন দরকার (যেমন কন্ডিশনাল কম্পাইলেশন, টোকেন পেস্টিং)- ম্যাজিক নাম্বার এড়াতে
constবাenumব্যবহার করুন