GNU 的巨集展開功能 (C 語言)

GNU 程式設計

GNU 程式簡介

GNU 與 C 語言

gcc 編譯器

glibc 函式庫

make 建置

ld 連結器

as 組譯器

ar 函式庫

objdump

objcopy

訊息

相關網站

參考文獻

最新修改

簡體版

English

範例 1 具有巨集的C語言 - 展開前與展開後的狀況
指令:gcc –E MacroTest.c –o MacroTest_E.c

(a) 展開前:MacroTest.c
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)

int main() {
  int x = max(3,5);
  int y = min(3,5);
  printf("max(3,5)=%d, min(3,5)=%d\n",x,y);
}
(b) 展開後:MacroTest_E.c
int main() {
  int x = (3>5?3:5);
  int y = (3<5?3:5);
  printf("max(3,5)=%d,
        min(3,5)=%d\n",x,y);
}

條件式展開

C語言當中的巨集處理器,支援條件式展開的功能,這種功能對 C 語言相當重要,由其在專案管理上更是不可或缺。以下,我們將說明C語言中條件式展開的巨集處理器之用途。首先,請讀者看範例 2 (a) 的程式,該程式用 #ifdef 條件式巨集指令,定義了 bugs 變數與 error(msg) 巨集函數。並且在程式的最後利用 error() 函數印出錯誤訊息,然後報告總共有幾個錯誤。

接著,請讀者利用 gcc 加上 -E 參數的方式,編譯該程式,指令如下所示。

gcc -E macroDebug.c -o MacroDebug_E.c

該指令會將程式的巨集展開,但因為編譯時沒有定義 _DEBUG_ 這個符號,因此,展開後的程式不會印出除錯訊息。其原始碼如範例 2 (b) 所示。

範例 2. 具有條件式巨集的C語言 - 展開前與展開後的狀況

(a) 檔案:MacroDebug.c
#ifdef _DEBUG_
 int bugs = 0;
 #define error(msg) \
   {printf(msg);bugs++;}
#endif

#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)

int main() {
  int x = max(3,5);
  int y = min(3,5);
  printf("max(3,5)=%d\n",x);
  printf("min(3,5)=%d\n",y);
#ifdef _DEBUG_
  if (x!=5) 
    error("max(3,5)");
  if (y!=3) 
    error("min(3,5)");
  printf("共有%d個錯誤",bugs);
#endif
}
(b) 檔案:MacroDebug_E.c
int main() {
  int x = (3>5?3:5);
  int y = (3<5?3:5);
  printf("max(3,5)=%d\n",x);
  printf("min(3,5)=%d\n",y);
}
(c) 檔案:MacroDebug_DEBUG_E.c
int bugs = 0;

int main() {
  int x = (3>5?3:5);
  int y = (3<5?3:5);
  printf("max(3,5)=%d\n",x);
  printf("min(3,5)=%d\n",y);

  if (x!=5)
    {printf("max(3,5)");bugs++;};
  if (y!=3)
    {printf("min(3,5)");bugs++;};
  printf("共有 %d 個錯誤", bugs);

}

接著,再請讀者利用下列指令編譯該程式,其中的 –D_DEBUG_ 參數會動態的定義一個 _DEBUG_ 巨集符號傳給 gcc 編譯器。

gcc -E -D_DEBUG_ macroDebug.c -o MacroDebug_DEBUG_E.c

此時,由於 _DEBUG_ 符號已被定義,因此,展開後的程式會定義 bugs變數, error(msg) 函數,並印出除錯訊息。其原始碼如範例 2 (c) 所示。

這種條件式的巨集定義的方式,在 C 語言當中相當常見,利用這種方式,我們可以編譯出程式碼較大的除錯版本,以便於除錯時使用。然後,在程式要發行時,編譯一個沒有 _DEBUG_ 符號的版本,如此,發行的軟體程式會較為精簡,也不會動不動就跑出錯誤訊息來困擾使用者。這是使用 C 語言開發軟體時必須知道的基本知識。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License