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

下載本文檔

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

文檔簡介

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

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

掌握宏定義的一般方法

掌握文件包含命令的用法

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

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

9.2深入了解宏

9.3條件編譯

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

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

1.宏定義

2.文件包含命令

3.條件編譯命令[返回]《C語言程序設(shè)計》大連理工大學(xué)出版社2009年8月出版9.2深入了解宏在第3章,我們介紹了常量宏定義的一般格式;在第6章,我們介紹了帶參宏的使用。實際上,宏定義分為兩種:常量宏定義和帶參宏定義。使用了宏定義的源程序在正式編譯之前,要進(jìn)行宏替換,將源程序中出現(xiàn)的所有宏名都用后面定義的字符串進(jìn)行替換?!禖語言程序設(shè)計》大連理工大學(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)行宏替換時,要注意替換的次序,層層替換,從外到里。宏定義后面沒有分號,因為宏定義不是C語句。為了和一般變量進(jìn)行區(qū)別,習(xí)慣上,宏名用大寫字母,宏名所代替的值稱為字符串。《C語言程序設(shè)計》大連理工大學(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(“請輸入圓的半徑:\n”);scanf(“%f”,&r);printf(“C=%f,S=%f”,C(r),S(r));/*帶參宏C(r)和S(r)的使用,r是實參*/}注意:帶參宏定義的替換過程:首先將實參替換形參,然后再替換程序中的宏名。千萬要注意的是,實參不需要進(jìn)行任何計算直接替換,《C語言程序設(shè)計》大連理工大學(xué)出版社2009年8月出版如果在一個源程序中定義了符號常量,想在使用完后終止該宏定義的使用,可以使用#undef命令。#undef命令格式如下:

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

《C語言程序設(shè)計》大連理工大學(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);/*錯誤,S1的定義已經(jīng)取消*/

{

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

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

}

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

return0;

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

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

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

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

作用:若表達(dá)式為真,則編譯程序段1,否則編譯程序段2。此編譯命令類似于if…else….語句。《C語言程序設(shè)計》大連理工大學(xué)出版社2009年8月出版問題:輸入一行字符,可以任選兩種輸出方式:一種將字符變成其前一個字符輸出,一種將字符變成其下一個字符輸出。用#define命令來控制是否要變化。例如:#defineCHANGE1則變成后一個字符輸出。若#defineCHANGE0則變成前一個字符輸出?!禖語言程序設(shè)計》大連理工大學(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語言程序設(shè)計》大連理工大學(xué)出版社2009年8月出版9.4其它預(yù)處理命令A(yù)NSIC中除了規(guī)定常用的預(yù)編譯命令外,還規(guī)定了其他一些預(yù)編譯指令。

1.#error

2.#pragma

3.#line

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

語法格式:

#errormessage作用:編譯時輸出編譯錯誤信息“message”,從而且方便程序員檢查程序中出現(xiàn)的錯誤?!禖語言程序設(shè)計》大連理工大學(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;

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

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

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

#pragmamessage(“消息文本”)

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

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

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

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

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

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

注意:“printf(

溫馨提示

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

評論

0/150

提交評論