簡體   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