C语言中的卫生宏

在这里,我们将看到C中的卫生宏。我们知道C中宏的用法。但是有时,由于意外捕获标识符,它无法返回所需的结果。

如果看到以下代码,则可以看到它无法正常工作。

示例

#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
   int a = 10, b = 20;
   //为a和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;
   //为a和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

在这里我们可以看到该值未更新。因此,在这种情况下,我们将使用卫生宏。这些卫生宏是宏,这些宏的扩展可确保不会创建标识符的意外捕获。在这里,我们将不使用任何可能与扩展代码交互的变量名。这里在宏内部使用了另一个变量“ t”。程序本身未使用此功能。

示例

#include<stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
main(void) {
   int a = 10, b = 20;
   //为a和b两次调用宏
   INCREMENT(a);
   INCREMENT(b);
   printf("a = %d, b = %d\n", a, b);
}

输出结果

a = 11, b = 21