繁体   English   中英

使用#undef预处理程序指令

[英]Using #undef preprocessor directive

以下是这两个程序的微小更改。


实践

#include <stdio.h>
#define P (i+j)

main()
{
  int i,j,k=0;
  printf("\nI = ");
  scanf("%d",&i);
  printf("\nJ = ");
  scanf("%d",&j);
  k=P;
  printf("\nValue of Defined Macro P = %d\n",k);

  #undef P
    printf("\nValue of Undefined Macro P = %d\n",k);
}

上面程序的输出是:

I = 5

J = 9

Value of Defined Macro P = 14

Value of Undefined Macro P = 14


新的

#include <stdio.h>
#define P (i+j)

main()
{
  int i,j,k=0;
  printf("\nI = ");
  scanf("%d",&i);
  printf("\nJ = ");
  scanf("%d",&j);
  k=P;
  printf("\nValue of Defined Macro P = %d\n",P);

  #undef P
    printf("\nValue of Undefined Macro P = %d\n",P);
}

上面程序的输出是:

Practice.c: In function 'main':
Practice.c:15:48: error: 'P' undeclared (first use in this function)
    printf("\nValue of Undefined Macro P = %d\n",P);
                                               ^
Practice.c:15:48: note: each undeclared identifier is reported only once for eac
h function it appears in


现在,我想知道为什么Practice.c成功编译并执行了,在哪里我使用变量k来显示输出,以及为什么New.c在直接使用宏模板P显示了错误?

预处理器指令在发生的地方被替换。 在您写入k=P的行上将变量k设置为14,这与写入k=14完全等效,因此它在#undef之后仍然具有其值。

#define在编译期间替换代码中的字符串。 所以当编译器处理

#define P (i + j)它取代P的每一个实例,它认为与(i + j) ,直到它到达其读取点#undef P 这告诉编译器停止用(i + j)替换P

结果,没有替换P的最后一个实例(在#undef语句之后),并且由于在代码中上面没有声明变量P,因此导致错误。

在第一个程序中这不是问题,因为您已经在该行中声明了k

int i,j,k=0;

MISRA中的一条规则是#undef可以使不清楚哪个宏存在于翻译单元的特定点上。 因此,建议不要使用#undef来避免这种行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM