

下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1在文件包含命令中,如果被包含的文件名是撇號 “括起來的,則編譯系統(tǒng)首先在源程序文件所屬的文件目錄中尋找所包含的文件。如果沒有找到,再按系統(tǒng)規(guī)定的標(biāo)準(zhǔn)方式檢索其他目錄;如果被包含的文件名是用尖括號即小于號括起來的,則編譯系統(tǒng)直接按系統(tǒng)規(guī)定的標(biāo)準(zhǔn)方式檢索文件目錄尋找所包含的文件。因此,使用雙撇號的#include命令的檢索路徑將包含了使用尖括號的 #include命令的檢索路徑。頭文件.h文件file2.c的內(nèi)容如下:例如,文件file1.c的內(nèi)容如下:#include file1.cx,y,z;main( )float a,b,c;char c1,c2;在對文件file2.c進(jìn)行編譯 經(jīng)過編譯
2、預(yù)處理后,最終實際編譯的內(nèi)容為處理時,將首先對其中的x,y,z;#include命令進(jìn)行“文件包含”float a,b,c;處理,將文件file1.c中的全部char c1,c2;內(nèi)容到文件file2.c中的main( )#include file1.c處代替此行,也就是將文件file1.c中的內(nèi)容包含到文件file2.c中。6.1 文件包含命令一個C語言程序可以由多個函數(shù)組成。一個C程序中的多個函數(shù)模塊可以放在同一個文件中,也可以將各函數(shù)模塊分別放在若干個文件中。C語言的這種機(jī)制有利于進(jìn)行模塊化程序設(shè)計。文件包含是指一個源文件可以將另一個指定的源文件包括進(jìn)來。文件包含命令的一般形式為#inc
3、lude 或#include 文件名其功能是將指定文件中的全部內(nèi)容讀()到該命令所在的位置后一起被編譯。編譯預(yù)處理編譯預(yù)處理是指C語言編譯系統(tǒng)首先對程序模塊中的編譯預(yù)處理命令進(jìn)行處理。C 語言提供的編譯預(yù)處理命令主要有以下五種:宏定義文件包含命令條件編譯命令 4) #pragma 5) #line編譯預(yù)處理命令一般是在函數(shù)體的外面。在C語言中,為了與一般的C語句相區(qū)別,所有的編譯預(yù)處理命令都是以#開始的。第6章 編譯預(yù)處理文件包含命令條件編譯命令#pragma#line計算機(jī)程序設(shè)計基礎(chǔ)(1)- C語言程序設(shè)計(6)sunjiason電子工程系 信息認(rèn)知與智能系統(tǒng)羅姆樓6-104:/62796
4、1932014.10.2在上述程序中,由于開頭有一個宏定義命令#define LOW 1即定義了一個常量LOW,這個常量表示無關(guān)緊要的(在現(xiàn)在的程序中為1)。甚至如下形式:#define LOWLOW未定義為任何內(nèi)容,但是LOW已經(jīng)被定義了,這會使得#ifdef LOW為真。因此,條件編譯命令中的程序段1(即大寫字母轉(zhuǎn)換成小寫字母的程序段):if (ch=A & ch=a & ch=z) ch=ch - a + A;被舍棄。在這種情況下,C編譯系統(tǒng)相當(dāng)于編譯了如下的C源程序:#include main( ) char ch;pr f(inph:);scanf(%c, &ch);if (ch=A
5、 & ch=Z) ch=ch - A + a; /* 大寫字母轉(zhuǎn)換成小寫字母*/pr f(%cn, ch);【例6-1】 有下列C程序#define LOW標(biāo)識符#include main( )這個程序的功能是,對于由鍵盤輸入的 char ch;字符,將英文大寫字母轉(zhuǎn)換成小寫字母,其pr f(input ch:); 他字符不變。scanf(c,&ch);#ifdef LOWif (chA & chZ)ch=ch - A + a;/*大寫字母轉(zhuǎn)換成小寫字母*/#elseif (cha & chz)ch=ch - a + A;/*小寫字母轉(zhuǎn)換成大寫字母*/#endifpr f(cn,ch);#if
6、def,#else,#endif其一般形式為#ifdef 標(biāo)識符其作用是,如果“標(biāo)識符”已經(jīng)定義過(一程序段1般是指用#define命令定義),則程序段1參加編譯,而程序段2不參加編譯;否則(即“標(biāo)識#else符”沒有定義過)程序段2參加編譯,而程序段程序段2 1不參加編譯。其中程序段1和程序段2均可以包 #endif含任意條語句(不需要用花括號括起來)。#else部分可以省略,即可以寫為:#ifdef 標(biāo)識符它的作用是,如果“標(biāo)識符”已經(jīng)程序段1定義過,則程序段1參加編譯,否則程序#endif段1不參加編譯。6.2 條件編譯命令一般情況下,C源程序中的所有命令行與語句都要進(jìn)行編譯。如果希望對
7、C源程序中的部分內(nèi)容只在滿足一定條件時才進(jìn)行編譯;或者希望當(dāng)滿足某條件時對一部分語句進(jìn)行編譯,而當(dāng)條件不滿足時對另一部分語句進(jìn)行編譯。這就是“條件編譯”。C語言的編譯預(yù)處理程序提供了條件編譯能力,以便使同一個源程序在不同的編譯條件下能夠產(chǎn)生不同的目標(biāo)代碼文件。便于程序在不同 (操作系統(tǒng))上的移植(porting),使程序具有通用性和普適性。條件編譯命令有以下幾種形式:在使用文件包含命令時,要注意以下幾個問題:當(dāng)#include命令指定的文件中的內(nèi)容改變時,包含這個頭文件的所有源文件都應(yīng)該重新進(jìn)行編譯處理。一個#include命令只能指定一個被包含文件,如果需要包含多個文件,則要用多個#incl
8、ude命令實現(xiàn)。被包含的文件應(yīng)該是源文件,不能是經(jīng)編譯后的目標(biāo)文件文件包含可以嵌套使用,即被包含的文件中還可以使用 #include命令。但不能出現(xiàn)遞歸包含, 也就是A 文件用 #include命令文件包含B文件,則B文件不能通過#include命令直接或間接文件再包含A文件。由#include命令所指定的文件中可以有任何語言成分,因此,通常可以將經(jīng)常使用的、具有公用性質(zhì)的符號常量、帶參數(shù)的宏定義以及外部變量等集中起來放在這種頭文件中,以盡量避免一些重復(fù)操作。不要用#include命令 .c文件,這會 鄙視的在C編譯系統(tǒng)中,有許多以.h為擴(kuò)展名的文件,這些文件一般被稱為頭文件。在這些頭文件中,
9、對相應(yīng)函數(shù)的原型與符號常量等進(jìn)行了說明和定義。因此,如果要在程序中使用C編譯系統(tǒng)提供的 數(shù),則在源程序的開頭應(yīng)包含相應(yīng)的頭文件。例如,如果在一個程序模塊中要用到輸入或輸出函數(shù)時,則在該程序模塊前要用如下的包含命令將相應(yīng)的頭文件包含進(jìn)來:#include 使用不同的C數(shù),將需要包含不同的頭文件。在本書的附錄B中,列出了一些常用頭文件中所包含的數(shù)。#include #include #include #include 3#if,#else,#endif, #elif其一般形式為#if 常量表達(dá)式1其作用是,如果常量表達(dá)式1的值為程序段1“真”(值非0),則程序段1參加編譯, #elif 常量表達(dá)式
10、2 而其余程序段不參加編譯;否則如果常量表達(dá)式2的值為“真”(值非0),則程序程序段2段2參加編譯,而其余程序段不參加編譯;.以此類推,最終可能程序段n+1 #elif 常量表達(dá)式n 參加編譯。程序段n#else最終是從n+1個程序段中選擇一段參加編譯,生成相應(yīng)可執(zhí)行程序代碼。程序段n+1#endif#if,#else,#endif, #elif一種形式為#if 常量表達(dá)式其作用是,如果常量表達(dá)式的值為“真”(值非0),則程序段1參加編譯,而程序段2程序段1不參加編譯;否則(即常量表達(dá)式的值為0) #else程序段2參加編譯,而程序段1不參加編譯。程程序段2序段1和程序段2均可以包含任意條語句
11、(不需要用花括號括起來)。#endif在這種形式中,#else部分可以省略,即#if 常量表達(dá)式它的作用是,如果常量表達(dá)式的值程序段1為“真”(值非0),則程序段1參加編 #endif譯,否則程序段1不參加編譯。將例6.1程序中的條件編譯命令#ifdef改成#ifndef,即程序改成如下:#define LOW 1 #include main() char ch;pr f(inp h:);scanf(%c, &ch); #ifndef LOWif (ch=A & ch=a & ch=z) ch=ch - a + A; /* 小寫字母轉(zhuǎn)換成大寫字母*/ #endifpr f(%cn, ch);這
12、個程序的功能是,對于由鍵盤輸入的字符,將英文小寫字母轉(zhuǎn)換成大寫字母,其他字符不變。#ifndef,#else,#endif其一般形式為#ifndef 標(biāo)識符其作用是,如果“標(biāo)識符”沒有定義過,程序段1則程序段1參加編譯,而程序段2不參加編譯; #else否則(即“標(biāo)識符”定義過)程序段2參加編譯,而程序段1不參加編譯。程序段1和程序段程序段22均可以包含任意條語句(不需要用花括號括#endif起來)。#else部分可以省略,即可以寫為:#ifndef 標(biāo)識符它的作用是,如果標(biāo)識符沒有定義過,則程序段1參加編譯,否則程序段1不參程序段1加編譯。#endif這種形式的條件編譯命令與上一種差不多,只
13、是條件剛好相反,在實際應(yīng)用中,可以根據(jù)具體情況任選一種。條件編譯命令利用“標(biāo)識符”是否定義作為條件,在兩個程序段中選擇一個進(jìn)行編譯。條件編譯不同于根據(jù)條件選擇執(zhí)行不同的程序段選擇結(jié)構(gòu)中的各程序段不管最后是否被執(zhí)行,都需要進(jìn)行編譯,形成的目標(biāo)程序就會很長。而且,在實際運行時,要對條件進(jìn) 試后才能決定執(zhí)行哪個程序段,因而運行時間也長。采用條件編譯命令來處理,由于在編譯過程中就根據(jù)條件決定對哪一段程序進(jìn)行編譯,另外的程序段就不編譯了,從而減少了實際被編譯的語句,也減少了目標(biāo)程序的長度。并且,在實際執(zhí)行過程中不必再測試條件,減少了運行時間。當(dāng)條件編譯段比較多時,會大大提高程序的運行效率。如果將例6-1
14、源程序中的宏定義命令去掉,即程序變?yōu)?include main( ) char ch;程序的功能是將鍵盤輸入的小寫字母轉(zhuǎn) pr f(inp h:); 換成大寫字母(其他字符不變)輸出。 scanf(c,&ch);#ifdef LOWif (chA & chZ)ch=ch - A + a;/*大寫字母轉(zhuǎn)換成小寫字母*/#else此段會被舍棄if (cha & chz)ch=ch - a + A;/*小寫字母轉(zhuǎn)換成大寫字母*/#endifpr f(cn,ch);46.4 #line命令 #line一般形式為#line 數(shù)字 文件名其中文件名是任選項。其作用是讓編譯器編譯顯示錯誤信息時,改變當(dāng)前所顯
15、示的行號和文件名,便于調(diào)試。例如:在文件test.c中,#line 151從此行后,編譯信息顯示將是test.c的151行開始的計數(shù),實際上盡管#line 151所在的行可能是第1行。而在文件test.c中,#line 151 copy.c從此行后,編譯信息顯示將是copy.c的151行開始的計數(shù)。#pragma once作用是讓編譯器把指定的文件只包含一次,防止此文件被多次出現(xiàn)的重復(fù)定義等錯誤。通常放在頭文件的開始處。例如:你打開文件stdio.h,會看到開頭幾行為:#if _MSC_VER 1000#pragma once #endif其作用是當(dāng)一個文件多次include文件stdio.h
16、時,讓編譯器把文件stdio.h只文件包含一次,防止多次 出現(xiàn)的重復(fù)定義等錯誤。6.3 #pragma命令 #pragma一般形式為#pragma token-string其中token-string有多種,像alloc_text, auto_inline, bss_seg, check_stack, code_seg, const_seg, comment, component,data_seg, function, hdrstop, include_alias, init_seg1, inline_depth, inline_recur , rinsic, message, once, o
17、ptimize, pack, po ers_to_members1, setlocale, vtordisp1,warning等。其作用是,指示編譯器如何進(jìn)行編譯,比如如何處理某文件被多次include, 如何進(jìn)行內(nèi)存存放處理,比如緊縮方式pack等等。本書將僅講pack和once的使用。而且pack涉及到結(jié)構(gòu)體的成員對齊方式,將留到第11章再講。#undef其一般形式為#undef 標(biāo)識符其作用是,將已經(jīng)定義的標(biāo)識符變?yōu)槲炊x。例如:#define WIDTH80#define ADD( X, Y ) (X) + (Y). . .#undef WIDTH #undef ADD條件編譯還用來防止多個文件同一個頭文件時,出現(xiàn)多重定義同一個外部變量或說明。例頭文件EXLE.h:/* EXLE.h - Exle header file */#if !defined(EXLE_H) 或者寫為: #ifndef EXLE_H #define EXLE_Hstruct Exle . ; #endif若多個C文件都文件包含頭文件EXLE.h,加上此條件 編譯后,每個C文件編譯時,首先判斷開關(guān)量EX LE_H 是否已經(jīng)宏定義過了,若沒定義過,則宏定義EXLE_H,同時說明結(jié)構(gòu)體Exle。一旦某個文件過EXLE.h,則此開關(guān)量EXLE_H已經(jīng)宏定義過了,結(jié)構(gòu)體Ex le
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國工藝陶瓷噴泉行業(yè)投資前景及策略咨詢報告
- 2025至2030年中國工夫紅條茶行業(yè)發(fā)展研究報告001
- 書版權(quán)合同樣本
- 光儲建筑一體化設(shè)計企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 語言訓(xùn)練AI應(yīng)用行業(yè)跨境出海戰(zhàn)略研究報告
- 乳制空氣清新劑企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 不墊資合同樣本
- 債權(quán)投資AI應(yīng)用行業(yè)跨境出海戰(zhàn)略研究報告
- 個人合資公司合同樣本
- 借調(diào)勞動人員合同合同樣本
- 三位數(shù)乘兩位數(shù)乘法豎式100道及答案
- 廈門象嶼財務(wù)報表分析報告
- 勝利油田吊裝作業(yè)安全管理實施細(xì)則
- 2024年新課標(biāo)高考真題河北生物試卷(原卷版)
- 2024年廣州高三語文一模作文題5個參考立意看“相處之道”(附范文及解析)
- IARPA首次利用網(wǎng)絡(luò)心理學(xué)賦能網(wǎng)絡(luò)防御重塑安全
- 統(tǒng)編版《道德與法治》六年級下冊第5課《應(yīng)對自然災(zāi)害》精美課件(第1課時)
- 工會現(xiàn)金管理制度
- HG∕T 3792-2014 交聯(lián)型氟樹脂涂料
- 機(jī)制砂綠色生產(chǎn)技術(shù)規(guī)程
- 《工程招投標(biāo)與合同管理》全套教學(xué)課件
評論
0/150
提交評論