Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

มาโครที่ถูกสุขอนามัยในC


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