c語言預處理程序有三種,分別是:函數
1.包含頭文件,如:#include <stdio.h>spa
2.宏定義(本質是字符串的替換) 指針
如 :#define 宏名 串(宏體)調試
#define PI 3.14159作用域
#undef 終止宏定義的做用域字符串
如:#undef PI 原型
注:雙引號內與宏同名的字符串不作宏體展開io
#define R 3.0 編譯
#define PI 3.14159變量
#define L 2*PI*R /*宏體是表達式*/
注:引用宏只佔編譯時間,不佔運行時間。
引用宏沒有返回值。
帶參數的宏定義的通常形式:
#define 宏名(參數表) 字符串
如:#define S(a,b) a*b /* 對宏定義來講參數不須要指明類型 */
3.條件編譯(一般在程序調試中)
#if 常量表達式(爲非零值時執行程序段,爲0時不執行)
程序段(通常是要調試的程序段)
#endif
#ifdef 標識符
程序段一
#else
程序段二
#endif
功能:標識符以前已經定義,則編譯程序段一,不然執行程序段二
c語言預處理關鍵字:
#define #undef #include #if #ifdef
#ifndef #else #endif #line
(注意:#前面不能留空格)
1.包含文件(include)
#include 「文件名」通常文件
#inlcude <文件名>系統文件
編譯程序以該文件名的內容來替換該控制行,一般在每一個源文件開頭出現這樣的行,是爲了包含公共的#define和全程變量的說明以及函數原型。
使用#include可把其它文件(每每是.h文件)的內容包含進來,#include還容許嵌套使用,如:
使用#include的優勢
能夠把全部公共的、須要給程序各個函數共享的外部變量說明、函數原型和宏定義、類型定義等都放在某一文件上(一般以.h爲文件後綴)。其它文件的開頭只須用一條#include 「該.h」文件的語句,就能夠省去重寫這些說明、定義的麻煩,並且程序結構更爲清晰。如:
#include <stdio.h>
#include <math.h>
#include 「local.h」
2.宏定義
格式:
#define標識符單詞串
編譯程序用單詞串來替換#define後出現的該標識符。宏定義一般有兩種用途:
1)定義常量
如:
#define YES1
#define EOF-1
又如:
#define:==
#definethen
#definebegin{
#defineend;}
則能夠寫出Pascal風格的C程序:
if( i > 0) then
begin
a := 1; b:=2;
end
宏替換不只對常量定義有價值,使程序增長可讀性,並且許多函數均可以經過宏替換來表示,沒必要進行頻繁的函數調用,但宏替換佔有空間比函數大。
宏定義函數與普通函數的區別:
實現上,宏函數將相應串替換到函數中,而函數只需提供一個指向其實現代碼的指針。
通常只將相對比較簡單的函數用宏實現,其速度要比函數快,但佔用更多的存貯間。
取消宏定義:#undef YES
3.條件編譯
C語言預處理程序提供了根據條件對程序段進行有選擇地編譯的能力,而這些控制行自己不參加編譯。
條件編譯形式以下:
#if 常量表達式
#ifdef 標識符
#ifndef 標識符
如:
#if 常量表達式
程序段1 --常量表達式爲真時編譯
#else
程序段2 --常量表達式爲假時編譯
#endif
又如:
#ifdefYES
…--YES 已定義時編譯
#else
…--YES 未定義時編譯
#endif
咱們常常可在一些頭文件中見到下面語句:
#ifndef _ _THIS
#define _ _THIS
…
#endif
可用它們來避免該頭文件被重複包含。
4.行控制
格式:
#line 常量[標識符]
常量 –給定行號標識符 –命名當前的輸入文件名提示編譯程序自下行開始的源程序給出該行號。