7 C語言複習 編譯預處理

2021-08-14 03:52:04 字數 4885 閱讀 9150

一、巨集定義:

將乙個識別符號定義為乙個替換文字,在編譯過程中,將所有巨集名都用相應的文字去替換。

一。無參巨集定義:

1.    一般定義形式:

#define 識別符號 替換文字一般識別符號用大寫字母;

替換文字可以是任意東西各元素必須空格隔開;例:

計算    s=3(y^2+3y)+4(y^2+3y)+5(y^2+3y);

#include#define m (y*y+3*y)

void main()

無參巨集定義注意的問題:

1.習慣上巨集名用大寫字母,

2.    用替換文字進行替換的時候,是直接的( 文字 )替換,所以一般需要加小括號;

3.    巨集定義行末不加分號,若加上了分號,連同分號一起替換;

4.乙個#define只能定義乙個巨集,且只能在一行中定義乙個巨集;

若需要定義多個巨集,就需要多個#define,並寫在多行上;

5.    巨集定義時若一行寫不下,可用「\」續行:

#define pi 3.1415\

926;

6.    巨集定義可以出現在源程式的任何地方,但通常寫在函式之外,其作用域為從巨集定義起到原始檔結束;

7.    若要結束其作用域,可使用#undef,用法:

#undef pi

8.    巨集名在源程式中若用括號括起來,不替換:(純文字)例:

巨集替換的選擇性;

#include#define pi 3.1415926

void main()

9.    巨集定義允許巢狀,在巨集定義的替換文字中,可以使用已經定義過的巨集名,

展開時層層替換

#define pi 3.14

#define s pi*r*r

例: 用無參巨集定義表示常用的資料型別和輸出格式:

#include#define integer int

#define real float

#define p printf

#define d "%d\n"

#define f "%f\n"

void main()

二。帶參巨集定義:

巨集定義中的引數稱為形式引數,引用引數時給出的引數為實際引數

定義形式:

#define 巨集名(形參表) 替換文字

展開時,先把巨集引用替換為替換文字,再將替換文字中的形參用實參代替;

#define m(y) y*y+3*y

k=m(5);                            實際指的是    k=5*5+3*5;例:

帶參巨集定義求兩者中的大者:

#include#define max(a,b) (a>b)?a:b		//	巨集名與其後的(不得有空格,(即不能寫成max ()	)否則變為無引數定義;

// 帶參定義中,替換文字的形參通常用括號括起來,避免出錯,即((a)>(b))?(a):(b);

void main()

例: 乙個巨集定義代表多個語句:

#define sssv(s1,s2,s3,v) s1=l*w;	s2=l*h;	s3=w*h;	v=w*l*h;			

#include void main()

帶參巨集定義和函式的區別:

1.    引數性質不同,帶參巨集定義不必說明其性質,也不分配空間,函式需說明型別,也要分配空間

2.    實現方式不同,巨集展開是編譯時預處理完成的,不占用執行時間,函式呼叫占用時間;

3.    引數傳遞不同,若為實參傳遞,帶參巨集只簡單的字元替換,不計算表示式的值函式呼叫先計算表示式,在代入,

4.    返回值不同。帶參巨集定義無返回值,函式有返回值; 例:

帶參巨集定義是實參是表示式:

#define		sq(y)	(y)*(y)

#include void main()

例:

函式與帶參巨集定義的進一步比較:

#include#define sq_macro(y) ((y)*(y))

int sq_fun(int n);

int main()

i=1; // 迴圈歸零;

printf("sq_macro:\n");

while(i<=5)

printf("%d\n",sq_macro(i++)); //巨集引用的時候,sq_macro(i++)被替換為,((i++)*(i++)),取出i後,i自加兩次;

return 0;

}int sq_fun(int y)

條件編譯:

在一定條件下,僅僅編譯一部分語句,不滿足條件編譯另一部分;

一套程式要產生不同的版本,(演示版本,實際版本)避免重複定義時用;

條件編譯的三種形式:

1.    #ifdef    識別符號

程式段1

#else

程式段2

#endif

或者:#ifdef 識別符號

程式段#endif

說明:如果識別符號是已被#define命令定義過的巨集名,就對程式段1進行編譯;否則對程式段2進行編譯。例:

根據需要設定條件編譯,使之能控制對一些提示資訊的輸出:

#include#define debug

void main()

2.    #ifndef 識別符號

程式段1

#else

程式段2

#endif

若識別符號

未被定義,對程式段1進行編譯,否則對程式段2進行編譯。

與第一種形式正好相反。

3.    #if 常量表示式

程式段1    

#else

程式段2

#endif

如果常量表示式的值為真(非0),則對程式段1進行編譯,否則對程式段2進行編譯。例:

設定乙個"開關"r ,用於識別輸入值是半徑還是邊長,實現求圓或者正方形的面積

#include#define r 0

#define s 2

void main()

注意:

1.    條件編譯語句後面的#if後面的條件必須是常量表示式,大多數由#define定義的符號常量,便於切換不同的版本;

2.    條件編譯檢查某些變數的中間結果:

#define flag 1

#if flag    

printf("a=%d",a);

#endif

檔案包含:

1.    #include <....>        只在系統指定的目錄查詢制定的檔案;

一般呼叫系統提供的使用各式一,節省時間。

2.    #include "...."        先在當前工作目錄中尋找制定的標頭檔案,找不到再按標準去找;

要包含使用者自己寫的標頭檔案。若標頭檔案不在當前檔案,可加路徑,

說明幾點:

1.不要在標頭檔案中定義全域性變數和函式;

2.    乙個#include 只能包含乙個標頭檔案,若有多個檔案,需要用多個#include

3.    檔案包允許巢狀,即在乙個標頭檔案中可以包含另乙個標頭檔案。但不能重複包含的情況

#include"a.h"

#include"b.h"

若a.h和b.h都又包含了乙個標頭檔案x.h,即x.h被包含了兩次。如果x.h中定義了資料型別,就會出現重複定義錯誤。

4.當某個標頭檔案變化的時候,包含該標頭檔案的源程式也發生變化,需要重新編譯。

C語言編譯預處理

title date br description c語言編譯預處理 2019 11 06 14 35 32 0800 預處理 c語言 c語言預處理是對源 進行初步轉換 碼農有道 c源程式 編譯預處理 編譯 優化程式 匯程式設計序 鏈結程式 可執行檔案其中編譯預處理階段,讀取c源程式,對其中的預處理...

C 筆記整理7 編譯預處理命令 (總複習)

c語言中除了有說明語句和可執行語句以外,還用編譯預處理命令。按我的理解,其作用就是使畫面更加簡潔,程式更加靈活。需要注意的是,其是編譯系統在對源程式編譯為目標程式之前進行的。所以它最先開始喔。1,不帶引數的巨集定義 include 巨集名 巨集體 注意 1,巨集名為區別於變數,一般用大寫字母表示。2...

C語言 08 編譯預處理

8.1.1 無引數的巨集定義 巨集常量 如果在程式中大量使用到了100這個值,那麼為了方便管理,我們可以將其定義為 const int num 100 但是如果我們使用num定義乙個陣列,在不支援c99標準的編譯器上是不支援的,因為num不是乙個編譯器常量,如果想得到了乙個編譯器常量,那麼可以使用 ...