C提供的預處理功能主要有以下3種: 1.宏定義 2.文件包含 3.條件編譯 分別用宏定義命令、文件包含命令、條件編譯命令來實現,這些命令以“#”開頭。
#define PI 3.14
說明:
他的作用是在本程序文件中用指定的標識符PI來代替“3.1415926”這個字符串。在預處理時,將程序中在該命令出現後的所有的PI都用“3.1415926”;我們把這些標識符稱為“宏名”。一般的,宏名習慣用大寫表示,以便與變量名相區別。其次,宏定義是在預編譯時不作正確性檢查。最後,宏定義不是C語句,不必在行末在分號,如果添加了則會連分號一起進行置換,極易出錯。
例子:
宏展開,語句為#define PI 3.14; ... area = 3.14*r*r;
area = 3.14;*r*r;//語法錯誤
展開過程: 在程序中如果帶有實參的宏(如S(3,2))則按#define命令行中指定的字符串從左到右進行置換。如果串中包含形參(形如a、b),則將相應的實參代替形參。如果字符串中的字符不是參數字符(形如*)則保留。替換過程如下圖//定義矩形面積S,a和b是變長 #define S(a,b) a*b ... area = S(3,2);
因此賦值語句展開為
例子:area = 3*2;
運行結果:#define PI 3.14 #define S(r) PI*(r)*(r) int _tmain(int argc, _TCHAR* argv[]) { float a, area; a = 2; area = S(a+1);//展開3.14*(a+1)*(a+1) printf("r=%.2f,area=%.2f\n",a,area); }
注意:在宏名與帶參數的括號之間不應加空格,否則會變成不帶參數的宏定義,容易出錯; 例子:r=2.0,area=28.26
#define S (r) 3.14*(r)*(r) 。。。 area = S(a+1);//展開3.14*(r)*(r)(a+1)
#include<文件名> (一般是庫文件) #include”文件名“ (用戶自定義文件)下圖形象的展示了文件包含
(1)如果定義“標識符”則執行“程序段1”
#ifdef 標識符<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICAgs8zQ8rbOMTwvcD4KPHA+ICAgICAjZW5kaWY8L3A+CjxwPsD919M6PC9wPgo8YmxvY2txdW90ZT4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#ifdef COMPUTER_A #define INTEGER_SIZE 16 #endif
(2)如果定義“標識符”執行“程序段1”,否則執行“程序段2”
#ifdef 標識符
程序段1
#else
程序段2
#endif
例子:
#ifdef COMPUTER_A #define INTEGER_SIZE 16 #else #define INTEGER_SIZE 32 #endif
(3)如果沒定義“標識符”則執行“程序段1”
#ifndef 標識符
程序段1
#endif
(4)如果“真”執行 “程序段1”否則執行“ 程序段2”
#if 表達式
程序段1
#else
程序段2
#endif
總結:預編譯功能是C語言特有的,有利於程序的可移植性,增加程序的靈活性