[英]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.