首頁考試吧論壇Exam8視線考試商城網(wǎng)絡(luò)課程模擬考試考友錄實用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓(xùn) 自學(xué)考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點日語
職稱英語
口譯筆譯
申碩英語
零起點韓語
商務(wù)英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點英語
托福考試
托業(yè)考試
零起點法語
雅思考試
成人英語三級
零起點德語
等級考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報 關(guān) 員
外 銷 員
價格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會工作者
銀行從業(yè)
教師資格
營養(yǎng)師
保險從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營 銷 師
司法考試
國際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會計從業(yè)資格
基金從業(yè)資格
統(tǒng)計從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計師
會計職稱
法律顧問
ACCA考試
注冊會計師
資產(chǎn)評估師
審計師考試
高級會計師
注冊稅務(wù)師
國際內(nèi)審師
理財規(guī)劃師
美國注冊會計師
一級建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價師
二級建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價工程師
注冊測繪師
質(zhì)量工程師
巖土工程師
造價員考試
注冊計量師
環(huán)保工程師
化工工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
監(jiān)理工程師
房地產(chǎn)估價
土地估價師
安全評價師
房地產(chǎn)經(jīng)紀(jì)人
投資項目管理師
環(huán)境影響評價師
土地登記代理人
繽紛校園 實用文檔 英語學(xué)習(xí) 作文大全 求職招聘 論文下載 訪談|游戲
軟件水平考試
軟件水平考試資訊
軟件水平考試試題
軟件水平考試專項輔導(dǎo)
軟件水平考試交流互動
軟件水平考試交流互動
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員資料 > 正文

C語言初學(xué)者入門知識之預(yù)處理

  概述

  在前面各章中,已多次使用過以“#”號開頭的預(yù)處理命令。如包含命令# include,宏定義命令# define等。在源程序中這些命令都放在函數(shù)之外, 而且一般都放在源文件的前面,它們稱為預(yù)處理部分。

  所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預(yù)處理是C語言的一個重要功能, 它由預(yù)處理程序負(fù)責(zé)完成。當(dāng)對一個源文件進(jìn)行編譯時, 系統(tǒng)將自動引用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理, 處理完畢自動進(jìn)入對源程序的編譯。

  C語言提供了多種預(yù)處理功能,如宏定義、文件包含、 條件編譯等。合理地使用預(yù)處理功能編寫的程序便于閱讀、修改、 移植和調(diào)試,也有利于模塊化程序設(shè)計。本章介紹常用的幾種預(yù)處理功能。

  宏定義

  在C語言源程序中允許用一個標(biāo)識符來表示一個字符串, 稱為“宏”.被定義為“宏”的標(biāo)識符稱為“宏名”.在編譯預(yù)處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換, 這稱為“宏代換”或“宏展開”.

  宏定義是由源程序中的宏定義命令完成的。 宏代換是由預(yù)處理程序自動完成的。在C語言中,“宏”分為有參數(shù)和無參數(shù)兩種。 下面分別討論這兩種“宏”的定義和調(diào)用。

  無參宏定義

  無參宏的宏名后不帶參數(shù)。其定義的一般形式為: #define 標(biāo)識符 字符串 其中的“#”表示這是一條預(yù)處理命令。凡是以“#”開頭的均為預(yù)處理命令!癲efine”為宏定義命令。 “標(biāo)識符”為所定義的宏名。“字符串”可以是常數(shù)、表達(dá)式、格式串等。在前面介紹過的符號常量的定義就是一種無參宏定義。 此外,常對程序中反復(fù)使用的表達(dá)式進(jìn)行宏定義。例如: # define M (y*y+3*y) 定義M表達(dá)式(y*y+3*y)。在編寫源程序時,所有的(y*y+3*y)都可由M代替,而對源程序作編譯時,將先由預(yù)處理程序進(jìn)行宏代換,即用(y*y+3*y)表達(dá)式去置換所有的宏名M,然后再進(jìn)行編譯。

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

  main(){

  int s,y;

  printf("input a number: ");

  scanf("%d",&y);

  s=3*M+4*M+5*M;

  printf("s=%d\n",s);

  }

  上例程序中首先進(jìn)行宏定義,定義M表達(dá)式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏調(diào)用。在預(yù)處理時經(jīng)宏展開后該語句變?yōu)椋簊=3*(y*y+3*y)+4(y*y+3*y)+5(y*y+3*y);但要注意的是,在宏定義中表達(dá)式(y*y+3*y)兩邊的括號不能少。否則會發(fā)生錯誤。

  當(dāng)作以下定義后: #difine M y*y+3*y在宏展開時將得到下述語句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;這相當(dāng)于; 3y2+3y+4y2+3y+5y2+3y;顯然與原題意要求不符。計算結(jié)果當(dāng)然是錯誤的。 因此在作宏定義時必須十分注意。應(yīng)保證在宏代換之后不發(fā)生錯誤。對于宏定義還要說明以下幾點:

  1. 宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)。

  2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

  3. 宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結(jié) 束。如要終止其作用域可使用# undef命令,例如:

  # define PI 3.14159

  main()

  {

  ……

  }

  # undef PIPI的作用域

  f1()

  …表示PI只在main函數(shù)中有效,在f1中無效。

  4. 宏名在源程序中若用引號括起來,則預(yù)處理程序不對其作宏代換。

  #define OK 100

  main()

  {

  printf("OK");

  printf("\n");

  }

  上例中定義宏名OK表示100,但在printf語句中OK被引號括起來,因此不作宏代換。程序的運(yùn)行結(jié)果為:OK這表示把“OK”當(dāng)字符串處理。

  5. 宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時由預(yù)處理程序?qū)訉哟鷵Q。例如:

  #define PI 3.1415926

  #define S PI*y*y /* PI是已定義的宏名*/對語句: printf("%f",s);

  在宏代換后變?yōu)椋?printf("%f",3.1415926*y*y);

  6. 習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別。但也允許用小寫字母。

  7. 可用宏定義表示數(shù)據(jù)類型,使書寫方便。例如: #define STU struct stu在程序中可用STU作變量說明:

  STU body[5],*p;#define INTEGER int

  在程序中即可用INTEGER作整型變量說明: INTEGER a,b; 應(yīng)注意用宏定義表示數(shù)據(jù)類型和用typedef定義數(shù)據(jù)說明符的區(qū)別。宏定義只是簡單的字符串代換,是在預(yù)處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換, 而是對類型說明符重新命名。被命名的標(biāo)識符具有類型定義說明的功能。請看下面的例子: #define PIN1 int* typedef (int*) PIN2;從形式上看這兩者相似, 但在實際使用中卻不相同。下面用PIN1,PIN2說明變量時就可以看出它們的區(qū)別: PIN1 a,b;在宏代換后變成 int *a,b;表示a是指向整型的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數(shù)據(jù)類型, 但畢竟是作字符代換。在使用時要分外小心,以避出錯。

  8. 對“輸出格式”作宏定義,可以減少書寫麻煩。例9.3 中就采用了這種方法。

  #define P printf

  #define D "%d\n"

  #define F "%f\n"

  main(){

  int a=5, c=8, e=11;

  float b=3.8, d=9.7, f=21.08;

  P(D F,a,b);

  P(D F,c,d);

  P(D F,e,f);

  }

  帶參宏定義

  C語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù), 在宏調(diào)用中的參數(shù)稱為實際參數(shù)。對帶參數(shù)的宏,在調(diào)用中,不僅要宏展開, 而且要用實參去代換形參。

1 2 3 4 下一頁

  相關(guān)推薦:

  2012年軟考系統(tǒng)分析師考試60天完美復(fù)習(xí)計劃

  2012年軟件水平考試網(wǎng)絡(luò)工程師章節(jié)筆記講義匯總

  2012年上半年軟件水平考試成績查詢匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。