一、巨集定義:
將乙個識別符號定義為乙個替換文字,在編譯過程中,將所有巨集名都用相應的文字去替換。
一。無參巨集定義:
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不是乙個編譯器常量,如果想得到了乙個編譯器常量,那麼可以使用 ...