使用#undef预处理程序指令

时间:2014-06-21 06:44:18

标签: c undefined preprocessor-directive

  

以下是两个变化很小的程序。


  

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直接?

3 个答案:

答案 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以避免这种行为。