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