Macro thường gây lỗi "accidental capture" khi biến cục bộ trong macro trùng tên biến ngoài.
Ví dụ lỗi
#define INCREMENT(i) do { int a=0; ++i; } while(0)
int a=10, b=20;
INCREMENT(a); // Mở rộng: do { int a=0; ++a; } while(0) -> a ngoài không đổi!
INCREMENT(b); // OK
// Kết quả: a=10, b=21
Macro vệ sinh
Dùng tên biến nội bộ không xung đột (vd: t, __temp).
#define INCREMENT(i) do { int t=0; ++i; } while(0)
INCREMENT(a); INCREMENT(b);
// Kết quả: a=11, b=21 (đúng)
Nguyên tắc: Tránh tên biến phổ biến (i, j, a, b, x, y...) trong macro.