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

更新于: 30-Jul-2019

474 次浏览

开启您的职业生涯

完成课程获得认证

开始
广告