函數:取大值 max(a,b)

採用函數的作法

檔案: max.c

#include <stdio.h>

int max(int a, int b) {
  if (a>b)
    return a;
  else
    return b;
}

int main() {
  int m = max(9,5);
  printf("max(9,5)=%d\n", m);
}

執行結果:

D:\Dropbox\cccwd\db\c\code>gcc max.c -o max

D:\Dropbox\cccwd\db\c\code>max
max(9,5)=9

採用巨集的作法

C 語言屬於靜態語言,所有變數都要宣告型態,這樣編譯器才能正確進行編譯。

但是如果你想寫一個《通用的函數》,不想綁訂在某些型態上,在 C 語言裡應該怎麼辦呢?

一個可能的方法是使用巨集!

巨集和函數不同,會被事先展開,然後在進行編譯,以下是一個用 C 語言設計通用的 max(a,b) 巨集的範例!

檔案: maxMacro.c

#include <stdio.h>

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

int main() {
  int m = max(9,5);
  printf("max(9,5)=%d\n", m);

  printf("max(3,8)=%d\n", max(3,8));
}

執行結果:

D:\Dropbox\cccwd\db\c\code>gcc maxMacro.c -o maxMacro

D:\Dropbox\cccwd\db\c\code>maxMacro
max(9,5)=9
max(3,8)=8

這種巨集會被先展開成沒有巨集的程式,方法是在每次呼叫時都《將整段程式碼貼上並取代參數》。

我們可以透過 gcc 的 -E 參數,來觀察展開的情況,指令如下:

D:\Dropbox\cccwd\db\c\code>gcc -E maxMacro.c -o maxMacro.i

以下是展開後的程式碼

// ... 前面有一大堆註解
int main() {
  int m = ((9>5)?9:5);
  printf("max(9,5)=%d\n", m);

  printf("max(3,8)=%d\n", ((3>8)?3:8));
}