

VIP免費下載
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1在文件包含命令中,如果被包含的文件名是撇號 “括起來的,則編譯系統首先在源程序文件所屬的文件目錄中尋找所包含的文件。如果沒有找到,再按系統規定的標準方式檢索其他目錄;如果被包含的文件名是用尖括號即小于號括起來的,則編譯系統直接按系統規定的標準方式檢索文件目錄尋找所包含的文件。因此,使用雙撇號的#include命令的檢索路徑將包含了使用尖括號的 #include命令的檢索路徑。頭文件.h文件file2.c的內容如下:例如,文件file1.c的內容如下:#include file1.cx,y,z;main( )float a,b,c;char c1,c2;在對文件file2.c進行編譯 經過編譯
2、預處理后,最終實際編譯的內容為處理時,將首先對其中的x,y,z;#include命令進行“文件包含”float a,b,c;處理,將文件file1.c中的全部char c1,c2;內容到文件file2.c中的main( )#include file1.c處代替此行,也就是將文件file1.c中的內容包含到文件file2.c中。6.1 文件包含命令一個C語言程序可以由多個函數組成。一個C程序中的多個函數模塊可以放在同一個文件中,也可以將各函數模塊分別放在若干個文件中。C語言的這種機制有利于進行模塊化程序設計。文件包含是指一個源文件可以將另一個指定的源文件包括進來。文件包含命令的一般形式為#inc
3、lude 或#include 文件名其功能是將指定文件中的全部內容讀()到該命令所在的位置后一起被編譯。編譯預處理編譯預處理是指C語言編譯系統首先對程序模塊中的編譯預處理命令進行處理。C 語言提供的編譯預處理命令主要有以下五種:宏定義文件包含命令條件編譯命令 4) #pragma 5) #line編譯預處理命令一般是在函數體的外面。在C語言中,為了與一般的C語句相區別,所有的編譯預處理命令都是以#開始的。第6章 編譯預處理文件包含命令條件編譯命令#pragma#line計算機程序設計基礎(1)- C語言程序設計(6)sunjiason電子工程系 信息認知與智能系統羅姆樓6-104:/62796
4、1932014.10.2在上述程序中,由于開頭有一個宏定義命令#define LOW 1即定義了一個常量LOW,這個常量表示無關緊要的(在現在的程序中為1)。甚至如下形式:#define LOWLOW未定義為任何內容,但是LOW已經被定義了,這會使得#ifdef LOW為真。因此,條件編譯命令中的程序段1(即大寫字母轉換成小寫字母的程序段):if (ch=A & ch=a & ch=z) ch=ch - a + A;被舍棄。在這種情況下,C編譯系統相當于編譯了如下的C源程序:#include main( ) char ch;pr f(inph:);scanf(%c, &ch);if (ch=A
5、 & ch=Z) ch=ch - A + a; /* 大寫字母轉換成小寫字母*/pr f(%cn, ch);【例6-1】 有下列C程序#define LOW標識符#include main( )這個程序的功能是,對于由鍵盤輸入的 char ch;字符,將英文大寫字母轉換成小寫字母,其pr f(input ch:); 他字符不變。scanf(c,&ch);#ifdef LOWif (chA & chZ)ch=ch - A + a;/*大寫字母轉換成小寫字母*/#elseif (cha & chz)ch=ch - a + A;/*小寫字母轉換成大寫字母*/#endifpr f(cn,ch);#if
6、def,#else,#endif其一般形式為#ifdef 標識符其作用是,如果“標識符”已經定義過(一程序段1般是指用#define命令定義),則程序段1參加編譯,而程序段2不參加編譯;否則(即“標識#else符”沒有定義過)程序段2參加編譯,而程序段程序段2 1不參加編譯。其中程序段1和程序段2均可以包 #endif含任意條語句(不需要用花括號括起來)。#else部分可以省略,即可以寫為:#ifdef 標識符它的作用是,如果“標識符”已經程序段1定義過,則程序段1參加編譯,否則程序#endif段1不參加編譯。6.2 條件編譯命令一般情況下,C源程序中的所有命令行與語句都要進行編譯。如果希望對
7、C源程序中的部分內容只在滿足一定條件時才進行編譯;或者希望當滿足某條件時對一部分語句進行編譯,而當條件不滿足時對另一部分語句進行編譯。這就是“條件編譯”。C語言的編譯預處理程序提供了條件編譯能力,以便使同一個源程序在不同的編譯條件下能夠產生不同的目標代碼文件。便于程序在不同 (操作系統)上的移植(porting),使程序具有通用性和普適性。條件編譯命令有以下幾種形式:在使用文件包含命令時,要注意以下幾個問題:當#include命令指定的文件中的內容改變時,包含這個頭文件的所有源文件都應該重新進行編譯處理。一個#include命令只能指定一個被包含文件,如果需要包含多個文件,則要用多個#incl
8、ude命令實現。被包含的文件應該是源文件,不能是經編譯后的目標文件文件包含可以嵌套使用,即被包含的文件中還可以使用 #include命令。但不能出現遞歸包含, 也就是A 文件用 #include命令文件包含B文件,則B文件不能通過#include命令直接或間接文件再包含A文件。由#include命令所指定的文件中可以有任何語言成分,因此,通常可以將經常使用的、具有公用性質的符號常量、帶參數的宏定義以及外部變量等集中起來放在這種頭文件中,以盡量避免一些重復操作。不要用#include命令 .c文件,這會 鄙視的在C編譯系統中,有許多以.h為擴展名的文件,這些文件一般被稱為頭文件。在這些頭文件中,
9、對相應函數的原型與符號常量等進行了說明和定義。因此,如果要在程序中使用C編譯系統提供的 數,則在源程序的開頭應包含相應的頭文件。例如,如果在一個程序模塊中要用到輸入或輸出函數時,則在該程序模塊前要用如下的包含命令將相應的頭文件包含進來:#include 使用不同的C數,將需要包含不同的頭文件。在本書的附錄B中,列出了一些常用頭文件中所包含的數。#include #include #include #include 3#if,#else,#endif, #elif其一般形式為#if 常量表達式1其作用是,如果常量表達式1的值為程序段1“真”(值非0),則程序段1參加編譯, #elif 常量表達式
10、2 而其余程序段不參加編譯;否則如果常量表達式2的值為“真”(值非0),則程序程序段2段2參加編譯,而其余程序段不參加編譯;.以此類推,最終可能程序段n+1 #elif 常量表達式n 參加編譯。程序段n#else最終是從n+1個程序段中選擇一段參加編譯,生成相應可執行程序代碼。程序段n+1#endif#if,#else,#endif, #elif一種形式為#if 常量表達式其作用是,如果常量表達式的值為“真”(值非0),則程序段1參加編譯,而程序段2程序段1不參加編譯;否則(即常量表達式的值為0) #else程序段2參加編譯,而程序段1不參加編譯。程程序段2序段1和程序段2均可以包含任意條語句
11、(不需要用花括號括起來)。#endif在這種形式中,#else部分可以省略,即#if 常量表達式它的作用是,如果常量表達式的值程序段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; /* 小寫字母轉換成大寫字母*/ #endifpr f(%cn, ch);這
12、個程序的功能是,對于由鍵盤輸入的字符,將英文小寫字母轉換成大寫字母,其他字符不變。#ifndef,#else,#endif其一般形式為#ifndef 標識符其作用是,如果“標識符”沒有定義過,程序段1則程序段1參加編譯,而程序段2不參加編譯; #else否則(即“標識符”定義過)程序段2參加編譯,而程序段1不參加編譯。程序段1和程序段程序段22均可以包含任意條語句(不需要用花括號括#endif起來)。#else部分可以省略,即可以寫為:#ifndef 標識符它的作用是,如果標識符沒有定義過,則程序段1參加編譯,否則程序段1不參程序段1加編譯。#endif這種形式的條件編譯命令與上一種差不多,只
13、是條件剛好相反,在實際應用中,可以根據具體情況任選一種。條件編譯命令利用“標識符”是否定義作為條件,在兩個程序段中選擇一個進行編譯。條件編譯不同于根據條件選擇執行不同的程序段選擇結構中的各程序段不管最后是否被執行,都需要進行編譯,形成的目標程序就會很長。而且,在實際運行時,要對條件進 試后才能決定執行哪個程序段,因而運行時間也長。采用條件編譯命令來處理,由于在編譯過程中就根據條件決定對哪一段程序進行編譯,另外的程序段就不編譯了,從而減少了實際被編譯的語句,也減少了目標程序的長度。并且,在實際執行過程中不必再測試條件,減少了運行時間。當條件編譯段比較多時,會大大提高程序的運行效率。如果將例6-1
14、源程序中的宏定義命令去掉,即程序變為#include main( ) char ch;程序的功能是將鍵盤輸入的小寫字母轉 pr f(inp h:); 換成大寫字母(其他字符不變)輸出。 scanf(c,&ch);#ifdef LOWif (chA & chZ)ch=ch - A + a;/*大寫字母轉換成小寫字母*/#else此段會被舍棄if (cha & chz)ch=ch - a + A;/*小寫字母轉換成大寫字母*/#endifpr f(cn,ch);46.4 #line命令 #line一般形式為#line 數字 文件名其中文件名是任選項。其作用是讓編譯器編譯顯示錯誤信息時,改變當前所顯
15、示的行號和文件名,便于調試。例如:在文件test.c中,#line 151從此行后,編譯信息顯示將是test.c的151行開始的計數,實際上盡管#line 151所在的行可能是第1行。而在文件test.c中,#line 151 copy.c從此行后,編譯信息顯示將是copy.c的151行開始的計數。#pragma once作用是讓編譯器把指定的文件只包含一次,防止此文件被多次出現的重復定義等錯誤。通常放在頭文件的開始處。例如:你打開文件stdio.h,會看到開頭幾行為:#if _MSC_VER 1000#pragma once #endif其作用是當一個文件多次include文件stdio.h
16、時,讓編譯器把文件stdio.h只文件包含一次,防止多次 出現的重復定義等錯誤。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等。其作用是,指示編譯器如何進行編譯,比如如何處理某文件被多次include, 如何進行內存存放處理,比如緊縮方式pack等等。本書將僅講pack和once的使用。而且pack涉及到結構體的成員對齊方式,將留到第11章再講。#undef其一般形式為#undef 標識符其作用是,將已經定義的標識符變為未定義。例如:#define WIDTH80#define ADD( X, Y ) (X) + (Y). . .#undef WIDTH #undef ADD條件編譯還用來防止多個文件同一個頭文件時,出現多重定義同一個外部變量或說明。例頭文件EXLE.h:/* EXLE.h - Exle header file */#if !defined(EXLE_H) 或者寫為: #ifndef EXLE_H #define EXLE_Hstruct Exle . ; #endif若多個C文件都文件包含頭文件EXLE.h,加上此條件 編譯后,每個C文件編譯時,首先判斷開關量EX LE_H 是否已經宏定義過了,若沒定義過,則宏定義EXLE_H,同時說明結構體Exle。一旦某個文件過EXLE.h,則此開關量EXLE_H已經宏定義過了,結構體Ex le
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年度注冊公用設備工程師常考點試卷及答案詳解【奪冠系列】
- 安全教試題及答案
- 樂高碰撞測試題及答案
- 能源互聯網背景下的智能電網重構研究-洞察闡釋
- 基于AI的能源消耗預測與優化研究-洞察闡釋
- 出租車公司新能源汽車運營權與股權轉讓合同
- 2025年四川省非全日制新勞動合同書樣本
- 茶園資源整合與茶葉產業鏈承包合同
- 時尚家居定制安裝與售后保修合同
- 2025國內貨物買賣合同范本示例
- 幼兒園教師資格考試面試2024年下半年試題及解答
- 《工程招投標與合同管理》全套教學課件
- DL∕T 5342-2018 110kV~750kV架空輸電線路鐵塔組立施工工藝導則
- 2024年全國統一考試高考新課標Ⅰ卷數學試題(真題+答案)
- 抖音直播運營策劃部門職責及績效考核指標
- 2024江蘇揚州市高郵市交通產業投資集團有限公司招聘17人筆試備考題庫及答案解析
- 2024年高一生物學考模擬卷01
- 椎旁小關節病變影像診斷
- 2024年中國南水北調集團水網智慧科技限公司秋季公開招聘高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- MOOC 臨床生物化學檢驗技術-杭州醫學院 中國大學慕課答案
- JJG 705-2014液相色譜儀行業標準
評論
0/150
提交評論