ที่นี่เราจะเห็นมาโครที่ถูกสุขอนามัยใน C เราทราบการใช้มาโครใน C แต่บางครั้งก็ไม่ส่งกลับผลลัพธ์ที่ต้องการเนื่องจากมีการจับตัวระบุโดยไม่ได้ตั้งใจ
หากเราเห็นรหัสต่อไปนี้ เราจะเห็นว่ารหัสทำงานไม่ถูกต้อง
ตัวอย่าง
#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
int a = 10, b = 20;
//Call the macros two times for a and b
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
} หลังจากประมวลผลโค้ดล่วงหน้าแล้วจะเป็นแบบนี้ -
ตัวอย่าง
#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
int a = 10, b = 20;
//Call the macros two times for a and b
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 ในกรณีนี้ เราจะใช้มาโครที่ถูกสุขอนามัย มาโครที่ถูกสุขอนามัยเหล่านี้เป็นมาโครที่มีการขยายการรับประกันว่าจะไม่สร้างการจับตัวระบุโดยไม่ได้ตั้งใจ ที่นี่เราจะไม่ใช้ชื่อตัวแปรใด ๆ ที่อาจเสี่ยงต่อการเชื่อมต่อกับโค้ดภายใต้การขยาย ที่นี่ตัวแปรอื่นใช้ 't' ภายในมาโคร สิ่งนี้ไม่ได้ใช้ในโปรแกรมเอง
ตัวอย่าง
#include<stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
main(void) {
int a = 10, b = 20;
//Call the macros two times for a and b
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
} ผลลัพธ์
a = 11, b = 21