第9章預(yù)處理命令_第1頁(yè)
第9章預(yù)處理命令_第2頁(yè)
第9章預(yù)處理命令_第3頁(yè)
第9章預(yù)處理命令_第4頁(yè)
第9章預(yù)處理命令_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章預(yù)處理命令本章將詳細(xì)介紹ANSIC標(biāo)準(zhǔn)規(guī)定的常見(jiàn)預(yù)處理命令以及它們的用法。學(xué)習(xí)目標(biāo)

了解預(yù)處理命令的特點(diǎn)

掌握宏定義的一般方法

掌握文件包含命令的用法

了解條件編譯的作用和實(shí)現(xiàn)方法

了解其它相關(guān)的預(yù)處理命令《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版9.1概述

9.2深入了解宏

9.3條件編譯

9.4其它預(yù)處理命令

《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版9.1概述從語(yǔ)法上講,預(yù)處理命令不是C語(yǔ)句,所以每條預(yù)處理后面沒(méi)有“;”號(hào)。但是,恰當(dāng)?shù)厥褂妙A(yù)處理命令,可以改進(jìn)程序設(shè)計(jì)環(huán)境,簡(jiǎn)化程序開(kāi)發(fā)過(guò)程,提高程序的可讀性和移植性。ANSIC中主要定義了如下三類(lèi)預(yù)處理命令:

1.宏定義

2.文件包含命令

3.條件編譯命令[返回]《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版9.2深入了解宏在第3章,我們介紹了常量宏定義的一般格式;在第6章,我們介紹了帶參宏的使用。實(shí)際上,宏定義分為兩種:常量宏定義和帶參宏定義。使用了宏定義的源程序在正式編譯之前,要進(jìn)行宏替換,將源程序中出現(xiàn)的所有宏名都用后面定義的字符串進(jìn)行替換。《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版例程9-1常量宏的使用。源代碼:#include”stdio.h”#definePI3.14/*定義宏P(guān)I*/#defineR3/*定義宏R*/#defineC2*PI*R/*定義宏C*/#defineSPI*R*R/*定義宏S*/intmain(void){printf(“C=%f,S=%f”,C,S);}注意:宏定義可以嵌套。在進(jìn)行宏替換時(shí),要注意替換的次序,層層替換,從外到里。宏定義后面沒(méi)有分號(hào),因?yàn)楹甓x不是C語(yǔ)句。為了和一般變量進(jìn)行區(qū)別,習(xí)慣上,宏名用大寫(xiě)字母,宏名所代替的值稱(chēng)為字符串?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版例程9-2帶參宏定義的使用。源代碼:#include”stdio.h”#definePI3.14/*定義宏P(guān)I*/#defineC(r)2*PI*r/*定義帶參宏C,r是形參*/#defineS(r)PI*r*r/*定義帶參宏S,r是形參*/intmain(void){floatr;printf(“請(qǐng)輸入圓的半徑:\n”);scanf(“%f”,&r);printf(“C=%f,S=%f”,C(r),S(r));/*帶參宏C(r)和S(r)的使用,r是實(shí)參*/}注意:帶參宏定義的替換過(guò)程:首先將實(shí)參替換形參,然后再替換程序中的宏名。千萬(wàn)要注意的是,實(shí)參不需要進(jìn)行任何計(jì)算直接替換,《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版如果在一個(gè)源程序中定義了符號(hào)常量,想在使用完后終止該宏定義的使用,可以使用#undef命令。#undef命令格式如下:

#undef符號(hào)常量名稱(chēng)(或編譯標(biāo)志)作用:取消最近一次#define符號(hào)常量名稱(chēng)(或編譯標(biāo)志)命令,使定義的符號(hào)常量或編譯標(biāo)志失去作用。

《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版

例程9-3#undef的用法。

#include"stdio.h"

intmain(void)

{

#defineS1"123456"/*定義宏S1*/

printf("%s\n",S1);/*使用宏S1*/

#undefS1/*取消宏S1*/

printf("%s\n",S1);/*錯(cuò)誤,S1的定義已經(jīng)取消*/

{

#defineS2"abcdef"/*定義宏S2*/

printf("%s\n",S2);/*使用宏S2*/

}

printf("%s\n",S2);/*使用宏S2*/

return0;

}編譯時(shí)輸出如下編譯信息:errorC2065:'S1':undeclaredidentifier[返回]《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版9.3條件編譯

條件編譯命令實(shí)際上是用來(lái)讓程序員告訴編譯器,程序中哪些程序段該編譯,哪些不要編譯。條件編譯命令的引入,使得不同硬件平臺(tái)或軟件平臺(tái)的代碼可以同時(shí)編寫(xiě)在一個(gè)程序文件中,從而方便程序的維護(hù)和移植。同時(shí),可以針對(duì)具體情況,選擇代碼段被編譯?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版1.#ifdef宏名程序段1#else程序段2#endif

作用:若宏名已經(jīng)被#define定義過(guò),則編譯程序段1,否則編譯程序段2。這條編譯命令如同前面學(xué)過(guò)的if…else….語(yǔ)句,是一種典型的條件編譯命令?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版2.#ifndef宏名程序段1#else程序段2#endif

作用:若宏名沒(méi)有被#define定義過(guò),則編譯程序段1,否則編譯程序段2。與第一種形式完全相反?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版3.#if表達(dá)式程序段1#else程序段2#endif

作用:若表達(dá)式為真,則編譯程序段1,否則編譯程序段2。此編譯命令類(lèi)似于if…else….語(yǔ)句?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版問(wèn)題:輸入一行字符,可以任選兩種輸出方式:一種將字符變成其前一個(gè)字符輸出,一種將字符變成其下一個(gè)字符輸出。用#define命令來(lái)控制是否要變化。例如:#defineCHANGE1則變成后一個(gè)字符輸出。若#defineCHANGE0則變成前一個(gè)字符輸出?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版例程8-4代碼:#include”stdio.h”#defineCHANGE1intmain(void){charstr[80],ch;inti=0;;gets(str);while((ch=str[i])!=’\0’){#ifdefCHANGEstr[i]++;if(str[i]>255)str[i]=0;#elsestr[i]--;if(str[i]<0)str[i]=255;#endifi++;}puts(str);}[返回]《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版9.4其它預(yù)處理命令A(yù)NSIC中除了規(guī)定常用的預(yù)編譯命令外,還規(guī)定了其他一些預(yù)編譯指令。

1.#error

2.#pragma

3.#line

4.運(yùn)算符#和##《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版1.#error

語(yǔ)法格式:

#errormessage作用:編譯時(shí)輸出編譯錯(cuò)誤信息“message”,從而且方便程序員檢查程序中出現(xiàn)的錯(cuò)誤?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版例程9-5代碼:

#include"stdio.h"

intmain(void)

{

#defineS1"123456"

printf("%s\n",S1);

#undefS1

#ifndefS1

#errorNodefinedS1

#endif

{

#defineS2"abcdef"

printf("%s\n",S2);

}

printf("%s\n",S2);

return0;

}編譯時(shí)輸出如下編譯信息:fatalerrorC1189:#error:NodefinedS1《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版2.#pragma

#pragma指令來(lái)設(shè)定編譯器的狀態(tài)或者是指示編譯器觸發(fā)一些特定的動(dòng)作。語(yǔ)法格式:

#pragmapara作用是:如果para存在,則觸發(fā)相應(yīng)的動(dòng)作,否則忽略。#pragma提高C源程序?qū)幾g程序的可移植性。Para參數(shù)有很多,可以是message參數(shù)、once、code_seg、hdrstop、resource"*.dfm"、warning(disable:450734;once:4385;error:164)和comment(...),參數(shù)不同,作用也不同。《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版(1)message參數(shù)。語(yǔ)法格式:

#pragmamessage(“消息文本”)

作用:表示在編譯信息輸出窗口中輸出相應(yīng)的“消息文本”信息。(2)code_seg參數(shù)。語(yǔ)法格式:

#pragmacode_seg(["section-name"[,"section-class"]])

作用:用來(lái)設(shè)置程序中函數(shù)代碼存放的代碼段,主要用于開(kāi)發(fā)驅(qū)動(dòng)程序。

《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版(3)once參數(shù)。語(yǔ)法格式:#pragmaonce作用:一般放在在頭文件的最開(kāi)始,用來(lái)保證頭文件被編譯一次。(4)hdrstop參數(shù)。語(yǔ)法格式:#pragmahdrstop作用:表示預(yù)編譯頭文件到此為止,后面的頭文件不進(jìn)行預(yù)編譯。(5)resource"*.dfm"參數(shù)。語(yǔ)法格式:#pragmaresource"*.dfm"作用:表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。

《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版(6)warning(disable:369834;once:4385;error:164)參數(shù)。語(yǔ)法格式:#pragmawarning(disable:450734;once:4385;error:164)等價(jià)于:#pragmawarning(disable:450734)//不顯示4507和34號(hào)警_告信息#pragmawarning(once:4385)//4385號(hào)警_告信息僅報(bào)告一次#pragmawarning(error:164)//把164號(hào)警_告信息作為一個(gè)錯(cuò)誤。(7)comment(...)參數(shù)。語(yǔ)法格式:#pragmacomment(...)作用:該指令將一個(gè)注釋記錄放入一個(gè)對(duì)象文件或可執(zhí)行文件中。《C語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版3.#line#line是為了強(qiáng)制編譯器按指定的行號(hào),開(kāi)始對(duì)源程序的代碼重新編號(hào),在調(diào)試的時(shí)候,可以按此規(guī)定輸出錯(cuò)誤代碼的準(zhǔn)確位置。語(yǔ)法格式1:#lineconstant“filename”作用是:使得其后的源代碼從指定的行號(hào)constant重新開(kāi)始編號(hào),并將當(dāng)前文件的名命名為filename。語(yǔ)法格式2:#lineconstant作用:編譯時(shí),輸出出錯(cuò)代碼所在的位置(行號(hào))constant?!禖語(yǔ)言程序設(shè)計(jì)》大連理工大學(xué)出版社2009年8月出版4.運(yùn)算符#和##

操作符#通常稱(chēng)為字符串化的操作符,它把其后的串變成用雙引號(hào)包圍的串。操作符##把兩個(gè)標(biāo)記拼在一起,形成一個(gè)新標(biāo)記。例程8-6代碼:#include<stdio.h>#definesinglej(s)#sintmain(void){printf(singlej(123456));return0;}

注意:“printf(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論