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