資源描述:
《C語言-條件編譯》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第九章條件編譯回顧指針是一個變量,它存儲另一個對象的內(nèi)存地址指針的聲明由基本類型、星號(*)和變量名組成為指針賦值,賦值運算符右側(cè)必須是一個地址。如果是普通變量需要在前面加一個取地址運算符&;如果是另一個指針變量或者是一個數(shù)組,不需要加&運算符運算符*用于返回指針指向的內(nèi)存地址中存儲的值指針的算術(shù)運算的含義是指針的移動,將指針執(zhí)行加上或者減去一個整數(shù)值n的運算相當(dāng)于指針向前或向后移動n個數(shù)據(jù)單元指針可以執(zhí)行比較相等的運算,用來判斷兩個指針是否指向同一個變量指向數(shù)組的指針,存儲的是數(shù)組中元素的地址。目標(biāo)理解以“#”號開頭編譯預(yù)處理。理解宏定義。理解條件編譯。預(yù)處
2、理命令是由ANSIC統(tǒng)一規(guī)定的,但是它不是C語言本身的組成部分,不能直接對它們進行編譯。必須在對程序進行通常的編譯之前,先對程序中這些特殊的命令進行“預(yù)處理”,即根據(jù)預(yù)處理命令對程序作相應(yīng)的處理。經(jīng)過預(yù)處理后程序不再包括預(yù)處理命令了,最后再由編譯程序?qū)︻A(yù)處理后的源程序進行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼?,F(xiàn)在使用的許多C編譯系統(tǒng)都包括了預(yù)處理、編譯和連接等部分,在進行編譯時一氣呵成。因此不少用戶誤認為預(yù)處理命令是C語言的一部分,甚至以為它們是C語句,這是不對的。C提供的預(yù)處理功能主要有以下三種:1.宏定義2.文件包含3.條件編譯為了與一般C語句相區(qū)別,這
3、些命令以符號“#”開頭。9.1宏定義9.1宏定義9.1.1不帶參數(shù)的宏定義用一個指定的標(biāo)識符(即名字)來代表一個字符串,它的一般形式為:#define標(biāo)識符字符串例:#definePI3.1415926把這個標(biāo)識符(名字)稱為“宏名”;在預(yù)編譯時將宏名替換成字符串的過程稱為“宏展開”;#define是宏定義命令。例9.1利用不帶參數(shù)的宏計算(1)圓的面積;(2)矩形面積;(3)三角形面積。#include#definePI3.14#definea1.2#defineb2.4#defines2a*b#definex1.2#definey2.4#
4、defines3x*y/2.0voidmain(){doubler,s1;printf(“請輸入圓的半徑r:”);scanf(“%lf”,&r);s1=PI*r*r;printf(“圓的面積s1=%lf”,s1);printf(“矩形的面積s2=%lf”,s2);printf(“三角形的面積s3=%lf”,s3);}9.1宏定義【注意點】(1)在預(yù)定義中已經(jīng)用到的符號不能在函數(shù)中再定義,如:doubles2,s3,a,b,x,y;(2)在不帶參數(shù)的宏定義中像a,b,x,y必須先預(yù)定義后才能在后面的宏定義中使用,即宏定義可以嵌套,宏定義的字符串中可以
5、使用已定義的宏名,在宏展開時由預(yù)處理程序?qū)訉哟鷵Q;例如:#definea1.2#defineb2.4#defines2a*b(3)在宏定義中,符號常量一般大寫,本例中有大寫也有小寫。(4)編譯器在編譯之前把程序中出現(xiàn)的一切宏用其對應(yīng)的表達式字符串來替代,而不是計算表達式的值后才替代,即宏定義是用宏名表示的一個字符串,在宏展開時又以該字符串取代宏,這只是一種簡單的代換,字符串可以含有任何字符,可以是常量,也可以是表達式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯誤,只能在編譯已被宏展開后的源程序時才發(fā)現(xiàn)。9.1宏定義(5)在#define語句中,宏與字符串之間用空格隔開
6、,在表達式末尾沒有分號,不然分號也會被認為是表達式的一部分而出現(xiàn)在程序中宏出現(xiàn)的位置。(6)如果在雙引號中的字符串中出現(xiàn)宏名,則此字符串中的和宏名相同的字符是普通字符不會被替換。例如:printf(“矩形的面積s2=%lf”,s2);該語句中的第1個s2就不會被替換。另外對“輸出格式”作宏定義,可以減少書寫麻煩,但可讀性差。例如:#include#definePprintf#defineD“%d”#defineF“%f”voidmain(){inta=1,c=2;floatb=1.2,d=2.4;P(DF,a,b);P(DF,c,
7、d);}9.2帶參數(shù)的宏定義C語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實際參數(shù)。對帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實參去代換形參。帶參宏定義的一般形式為:#define宏名(形參表)字符串在字符串中含有各個形參。帶參數(shù)的宏調(diào)用的一般形式為:宏名(實參表);例如:#defineS2(a,b)(a)*(b)/*宏定義*/……printf(“矩形的面積S2=%lf”,S2(1.2,2.4));/*宏調(diào)用*/……在宏調(diào)用時,用實參1.2和2.4去代替形參a,b,經(jīng)預(yù)處理宏展開后的語句為:printf(“矩形的面積S2=%l
8、f”,1.2*2.4);例9.2利