এই সেকশনে দেখব সি-তে ম্যাক্রো ও ফাংশনের মধ্যে পার্থক্য। ম্যাক্রো প্রি-প্রসেসড হয়, অর্থাৎ কম্পাইলেশনের আগে সব ম্যাক্রো প্রিপ্রসেস হয়। ফাংশনগুলো প্রিপ্রসেসড হয় না, বরং কম্পাইল হয়।
ম্যাক্রোতে কোনো টাইপ চেকিং করা হয় না, তাই ভিন্ন টাইপের ইনপুটের জন্য সমস্যা হতে পারে। ফাংশনের ক্ষেত্রে এটি হয় না। ম্যাক্রোতে ইনপুট ঠিকমতো মেইনটেইন না করলে ইনভ্যালিড রেজাল্ট দিতে পারে। নিচের প্রোগ্রাম দেখুন।
উদাহরণ কোড
#include <stdio.h>
#define SQUARE(x) x * x
int sqr(int x) {
return x * x;
}
int main() {
printf("sqr() ব্যবহার: sqr(3+2) = %d\n", sqr(3+2));
printf("SQUARE() ব্যবহার: SQUARE(3+2) = %d", SQUARE(3+2));
}
আউটপুট
sqr() ব্যবহার: sqr(3+2) = 25 SQUARE() ব্যবহার: SQUARE(3+2) = 11
ফাংশন ও ম্যাক্রো দুটোই একই কাজ করতে চেয়েছিল, কিন্তু আউটপুট ভিন্ন। মূল কারণ: ফাংশন আর্গুমেন্ট হিসেবে 3+2 পাস করলে সেটি ৫ হয়ে যায়, তারপর ৫*৫=২৫। ম্যাক্রোর জন্য এটি করে 3 + 2 * 3 + 2 = 3 + 6 + 2 = 11।
তাই ম্যাক্রো নিচের সমস্যায় রিকমেন্ডেড নয়:
- টাইপ চেকিং নেই
- ডিবাগ করা কঠিন, কারণ সিম্পল রিপ্লেসমেন্ট করে
- ম্যাক্রোর নেমস্পেস নেই। এক সেকশনে ডিফাইন করা ম্যাক্রো অন্য সেকশনে ব্যবহার করা যায়।
- ম্যাক্রো কোড লেঙ্গ্থ বাড়ায় কারণ প্রিপ্রসেসিং সময় কোডের আগে যোগ হয়।
- কম্পাইল টাইম এরর চেক করে না।