C-এ ম্যাক্রো ব্যবহার করার সময় অকস্মাৎ আইডেন্টিফায়ার ক্যাপচারের কারণে ভুল ফলাফল হতে পারে। হাইজিনিক ম্যাক্রো এই সমস্যা সমাধান করে।
সমস্যা উদাহরণ
#include <stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
int main(void) {
int a = 10, b = 20;
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
}
প্রিপ্রসেসিং পর কোডটি হয়ে যায়:
int main(void) {
int a = 10, b = 20;
do { int a = 0; ++a; } while(0);
do { int a = 0; ++b; } while(0);
printf("a = %d, b = %d\n", a, b);
}
আউটপুট
a = 10, b = 21
এখানে 'a' আপডেট হয়নি কারণ ম্যাক্রোর ভেতরের 'a' বাইরের 'a'-কে শ্যাডো করেছে।
সমাধান: হাইজিনিক ম্যাক্রো
ম্যাক্রোর ভেতরে অনন্য ভেরিয়েবল নাম ব্যবহার করুন (যেমন 't') যাতে বাইরের কোডের সাথে নাম konflikt না হয়।
#include <stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
int main(void) {
int a = 10, b = 20;
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
আউটপুট
a = 11, b = 21