C 中的衛生宏


本文將 介紹 C 中的衛生宏。我們知道 C 中宏的用法。但有時,由於意外捕獲識別符號,導致它無法返回所需結果。

如果檢視以下程式碼,我們可以看到它無法正常工作。

示例

#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
   int a = 10, b = 20;
   //Call the macros two times for a and b
   INCREMENT(a);
   INCREMENT(b);
   printf("a = %d, b = %d
", a, b); }

預處理後,程式碼看起來像這樣 −

示例

#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
   int a = 10, b = 20;
   //Call the macros two times for a and b
   do { int a = 0; ++a; } while(0) ;
   do { int a = 0; ++b; } while(0) ;
   printf("a = %d, b = %d
", a, b); }

輸出

a = 10, b = 21

這裡我們可以看到 a 的值沒有更新。因此,在這種情況下,我們將使用衛生宏。這些衛生宏是其展開可以保證不會建立識別符號的意外捕獲的宏。在這裡,我們不會使用任何可能冒著與展開程式碼介面風險的變數名。這裡在宏中使用了另一個變數't'。這不會在程式中本身使用。

示例

#include<stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
main(void) {
   int a = 10, b = 20;
   //Call the macros two times for a and b
   INCREMENT(a);
   INCREMENT(b);
   printf("a = %d, b = %d
", a, b); }

輸出

a = 11, b = 21

更新於: 30-Jul-2019

474 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始
廣告