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
", 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
", 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
", a, b); }
输出
a = 11, b = 21
广告