C 速查手冊

前置處理器

所謂的前置處理是指在編譯前進行的處理工作,包含引入其他標頭檔 (header) 、定義常數符號、巨集 (macro) 等。 C 語言有多種前置處理器 (preprocessor) 指令,所有的前置處理指令均以井字號 # 開頭,這裡介紹常用的幾種,如下

功能範例
引入標頭檔#include <stdio.h>
定義符號常數#define PI 3.14
定義巨集#define CIRCUM(r) 2 * PI * (r)

#include 用為引入標頭檔,其後若接角括號 <> ,就是引入標準程式庫 (standard library) 的標頭檔,可以使用標準程式庫所提供的功能,而若是接雙引號,雙引號裡頭就可以放置自己寫的標頭檔。

#define 有兩種功能,其一為定義符號常數,形式如下

#define NANE constant

通常符號常數都為大寫英文字母,如以上的 NAME ,其後接一個空格,然後再接常數 (constant) 值。程式若用到該符號常數的地方,編譯器都會以該數字做替換。這樣的好處為程式有需要調整的常數數值的時候,只需要修改一個地方,不需要把整個程式翻修一次,如下例

#include <stdio.h>

#define RATE 31.95

int main(void)
{
    int m = 100;
    double r = (double) m / RATE;
    
    printf("今日用%d元可換得%.1f美金\n", m, r);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:define1.c
    功能:示範定義符號常數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc define1.c
$ a.out
今日用100元可換得3.1美金
$

由於匯率每天都會變化,若程式中有很多需要匯率代入的地方,利用前置處理器直接定義為符號常數確實有方便的地方。

#define 除了定義符號常數之外,另一個功能就是定義巨集。所謂的巨集是含有運算子的符號常數,可以直接做簡單的計算代換,形式如下

#define MARCRO(p) expression

如下例

#include <stdio.h>

#define PI 3.14
#define DIAMETER(r) 2 * (r)
#define CIRCUM(r) 2 * PI * (r)

int main(void)
{
    double radius = 10.;
    
    printf("圓的半徑 = %f\n", radius);
    printf("圓的直徑 = %f\n", DIAMETER(radius));
    printf("圓周長   = %f\n", CIRCUM(radius));
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:define2.c
    功能:示範巨集的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc define2.c
$ a.out
圓的半徑 = 10.000000
圓的直徑 = 20.000000
圓周長  = 62.800000
$

第 4 及第 5 行為巨集定義的地方

#define DIAMETER(r) 2 * (r)
#define CIRCUM(r) 2 * PI * (r)

如同函數 (function) 一樣,巨集中需要參數的地方也要用小括弧圍起來,其後運算式 (expression) 所計算出的值會代入巨集之中。利用巨集做簡單的計算會比呼叫函數快很多,因為巨集的直接插入原始碼中,避免函數呼叫會產生的堆疊。

上一頁 標頭檔
回 C 速查手冊首頁
下一頁 標準程式庫導覽