預處理命令
重點:
午餐宏定義和有參宏定義;
文件包含;
條件編譯。
一、宏定義
C語言標準允許在程序中用一個標識符來表示字符串,稱爲宏。標識符爲宏名,在編譯預處理時,將程序中所有的宏名用相應的字符串來替換,這個過程稱爲宏替換,宏分爲兩種:無參數宏和有參數宏。1.無參數宏
無參數宏定義一般形式:
#define 標識符字符串
“#”代表本行是編譯預處理命令。define是宏定義的關鍵詞,標識符是宏名。字符串是宏名所代替的內容,可以是常數、表達式等。
例:使用無參數宏的程序,輸入半徑,求圓的周長、面積和體積。
#include "stdafx.h"
#define PI 3.1415926
int _tmain(int argc, _TCHAR* argv[])
{
float l,s,r,v;
printf("input radius:");
scanf("%f",&r);
l=2.0*PI*r;
s=PI*r*r;
v=4.0/3.0*PI*r*r*r;
printf("l=%10.4f\n s=%10.4f\n v=%10.4f\n",l,s,v);
getchar();
return 0;
}
說明:使用宏代替一個字符串,可以減少程序中重複書寫某些字符串的工作量。如果沒有使用宏,那麼就要查找程序並修改所有的PI值。宏的作用範圍是從宏定義開始到源程序文件結束爲止。
2.有參數宏
有參數的宏類似於有參數的函數,其定義的一般形式:
#define 標識符(形參表)字符串
如果有多個形參,像函數參數一樣以逗號隔開。在程序中使用有參數宏的形式是:
標識符(實參表)
例:演示有參宏的實現方法
#include "stdafx.h"
#define MAX(x,y) (x>y?x:y)
int _tmain(int argc, _TCHAR* argv[])
{
int a=1,b=2,max;
max=MAX(a,b);
printf("the max between(%d,%d)is%d\n",a,b,max);
getchar();
return 0;
}
注意:宏名與形參表的圓括號之間不能有空格,否則會導致錯誤。在宏定義中,字符串內的形式參數最好用括號括起來,以避免錯誤。
總的來說,當語句較簡單時,可考慮使用宏定義,從程序執行的速度來說,它優於函數。使用宏的次數較多時,宏替換後源程序一般會變長。而函數調用不會使程序變長。宏替換不會佔用運行時間,只是編譯的時間稍微長一點。而函數調用則會佔用運行時間。一般用宏定義代表一些較爲簡單的表達式比較適合。
二、文件包含
文件包含是指把指定源文件的全部內容包括到當前源程序文件中。 一般形式:#include “文件名”
文件包含預定處理命令#include的作用是使一個源文件可以將另一個源文件的全部內容包含進來,把指定的文件插入命令行位置取代命令行,從而把指定文件和當前的源程序文件連成一個源程序。
三、條件編譯
條件編譯是指在特定的條件下,對滿足條件和不滿足條件的情況分別進行處理——滿足條件時編譯某些語句,不滿足條件時編譯一些語句。
條件編譯命令有幾種模式:
模式一:
#ifndef 標識符
程序段1
#endif
其含義是:如果沒有定義標識符,則編譯程序段1(既可以是語句組,也可以命令行)。
實例:
#ifndef getkey
#define getkey
#include <sys/types.h>
#endif
模式二:
#ifndef 標識符
程序段1
#else 程序段2
#endif
其含義是:如果沒有定義標識符,就編譯程序段1,否則就編譯程序段2。
模式三:
#ifdef 標識符
程序段1
#endif
其含義:如果定義了標識符,就編譯程序段1,否則就不編譯該程序段。
實例:
#ifdef DEBUG
printf{"a=%d,b=%d",a,b};
#endif
模式四:
#ifdef 標識符
程序段1
#else
程序段2
#endif
其含義是:如果定義了標識符,就編譯程序段1,否則編譯程序段2。
模式五:
#if 表達式
程序段1
#endif
其含義是:如果表達式成立,則就編譯程序段1,否則不編譯該程序段。
實例:
#include<stdio.h>
#define MAX(x,y) (x>y?x:y)
...
int a=5,b=10,c;
...
#if c
c=MAX(a,b);
#endif
模式六:
#if 表達式
程序段1
#else
程序段2
#endif
其含義是:如果表達式成立,就編譯程序段1,否則編譯程序段2。