ที่นี่เราจะเห็นมาโครที่ถูกสุขอนามัยใน 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