前置處理指令(#include、#define、#ifdef)
指令是給前置處理器的一行指示。你一眼就能認出它們:每一行都以 # 符號開頭,通常在最左邊。它們不是 C 敘述,不以分號結尾,且在編譯器執行時就已消失。可以把它們想成你留給那位在編譯器抵達前先工作的「文字貼上助理」的便利貼。
你最先遇到的三個是 #include、#define,以及 #ifdef 家族。#include <stdio.h> 這行說「把 stdio.h 標頭檔的內容貼到這裡」。角括號表示去系統的標準位置找;雙引號,如 #include "myheader.h",表示先在我自己的檔案旁邊找。#define NAME value 這行說「從這裡開始,把 NAME 這個字替換成 value」。#ifdef NAME ... #endif 這對說「只有 NAME 已被定義時才保留中間的文字,否則刪除它」,而 #ifndef 表示「只有 NAME 沒被定義時才保留」。還有更多(#if、#else、#elif、#undef、#pragma),但這幾個是主力。
指令是你用許多檔案組裝程式、並在不更動真正程式碼的情況下適應不同情況的方式。條件指令讓同一份原始檔在 Windows 與 Linux 上能編譯成不同樣子,或只在設定了 DEBUG 旗標時才納入除錯輸出。陷阱在於:因為指令作用於原始文字,不成對的 #ifdef 或漏掉的 #endif 會產生難以追蹤的錯誤,因為編譯器只看到由此產生、錯誤地被保留或刪除的文字。
#include <stdio.h> /* 把標頭檔貼進來 */ #define MAX 100 /* 下面每個 MAX 都變成 100 */ #ifdef DEBUG /* 只有定義了 DEBUG 才編譯 */ printf("max is %d\n", MAX); #endif
三個指令做三件事:貼上、替換,以及有條件地保留文字。
指令不是敘述:沒有分號,且它們無視 C 的範圍,所以在函式內寫 #define NAME 仍會影響整個檔案接下來的部分,而非僅限該函式。