以下是两个变化很小的程序。
Practice.c
#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
New.c
#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
直接?
答案 0 :(得分:1)
预处理程序指令将替换它们出现的位置。变量k
在您编写k=P
的行上设置为14,这与写k=14
完全等效,因此它仍然在#undef
之后具有其值。
答案 1 :(得分:1)
#define
在编译期间替换代码中的字符串。所以当编译器处理
#define P (i + j)
,它会替换它与(i + j)
看到的每个P实例,直到它到达#undef P
的位置。这告诉编译器停止用P
替换(i + j)
。
因此,P
的最后一个实例(在#undef
语句之后)未被替换,并且由于代码中没有上面声明的变量P,因此会导致错误。< / p>
这不是第一个程序中的问题,因为您已经在行
中声明了k
int i,j,k=0;
答案 2 :(得分:1)
MISRA中的规则是#undef可以使不清楚翻译单元内特定点存在哪些宏。 因此,建议不要使用#undef以避免这种行为。