?? 教學--第十四章 程序的文件結構.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls14.htm -->
<HTML><HEAD><TITLE>教學--第十四章 程序的文件結構</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3>
<CENTER>
<TABLE height=154 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: 宋體"
width="100%" height=148>
<H2>第十四章 程序的文件結構</H2>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.1">14.1
源文件和頭文件</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.2">14.2
如何創建多個單元文件</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.3">14.3
如何寫頭文件</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.3.1">14.3.1
在頭文件內加入函數聲明</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.3.2">14.3.2
最常見的預編譯語句</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.4">14.4
如何使用頭文件</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.5">14.5
變量在多個源文件之間的使用</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.5.1">14.5.1
變量聲明</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.5.2">14.5.2
多個文件中共享變量的實例</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls14.htm#14.6">14.6
附:如何單獨生成一個頭文件</A></P>
<P> </P>
<P>程序是由什么組成的? 學習到今天,我們至少有兩個答案:
<P>第1,程序由代碼語句組成。正是一行行的代碼,組成了一個完整的程序。
<P>第2,程序由函數組成。一個個函數之間的互相調用,最終構建出一個完整的程序。</P>
<P>今天我們又有一個新的回答:“程序由文件組成”。</P>
<P>程序為什么需要使用多個文件?</P>
<P>一個小的程序,可以只寫一個源文件,但程序稍微一大,就需要將其中不同的邏輯實現放到不同的源文件.對于需要多人一起開發的軟件,自然更需要多個源文件。</P>
<P> </P>
<H3><A name=14.1>14.1</A> 源文件和頭文件</H3>
<P> </P>
<P>和別的一些語言不同,C,C++的代碼文件有“頭文件”和“代碼文件”之分。二者合起來我們稱為單元<SPAN
lang=en-us>(Unit)</SPAN>文件。</P>
<P> </P>
<P>擴展名為 .c 或 .cpp 的文件,主要用以實現程序的各種功能,我們稱為代碼文件。</P>
<P>擴展名為 .h
的文件,稱為頭文件。在頭文件里主要寫一些函數、數據(包括數據類型的定義)、等的聲明,這樣可以在多個.c或.cpp文件內<B>共享</B>這些函數、數據。第12章我們提過到頭文件的功能。說它可以起到函數“名片夾”的作用。</P>
<P> </P>
<P>大都數時候,源文件和頭文件是對應出現的,比如有一個<SPAN lang=en-us> A.cpp </SPAN>的源文件,就會有一個<SPAN
lang=en-us> A.h </SPAN>的頭文件。這種情況在我們寫應用程序時,更是常見。所以C++
Builder對此進行了強化。比如,它支持在同名源文件和頭文件之間通過熱鍵來回切換。在CB6.0里,編輯器打開對應的源文件和頭文件時,將顯示為同一頁下的兩個子頁。</P>
<P> </P>
<P>我們來實際動手看看源文件與頭文件在CB里的對應關系。</P>
<P> </P>
<P>運行 C++ Builder 6或5。</P>
<P>這一次我們需要一個空白的<SPAN
lang=en-us>Windows</SPAN>工程。很有可能,在你打開CB時,它就自動為你打開了一個工程。為了不出錯,我們還是親自建一個。CB6請使用主菜單:<SPAN
lang=en-us>File | New | Application</SPAN>;而CB5則使用:<SPAN lang=en-us>File |
New Application</SPAN> <B>新建一個<SPAN lang=en-us>Windows
</SPAN>空白工程</B>。<SPAN lang=en-us> </SPAN>如果在這過程中CB出現是否存盤的詢問,請回答不存盤。</P>
<P> </P>
<P>找到“代碼窗口”。如果你看到的是一個叫<SPAN lang=en-us>"Form1"</SPAN>的表單,請按<SPAN
lang=en-us>F12,</SPAN>“代碼窗口”將跑到前面。它的標題應該是默認的<SPAN
lang=en-us>"Unit1.cpp"</SPAN>。正是當前代碼文件的文件名。如下圖:</P>
<P> </P>
<P><IMG src="教學--第十四章 程序的文件結構.files/ls14.h1.gif" border=0></P>
<P> </P>
<P>對于CB6,還可以看到在該窗口的底部有這樣一個分頁:</P>
<P> </P>
<P><IMG src="教學--第十四章 程序的文件結構.files/ls14.h2.gif" border=0></P>
<P> </P>
<P>源文件:<SPAN lang=en-us>Unit1.cpp </SPAN>和頭文件:<SPAN lang=en-us>Unit1.h
</SPAN>并列著,我們可以方便地選擇。至于<SPAN lang=en-us>
"Diagram"</SPAN>,稱為“圖解”。這是一個給這個源文件加配套注解,及表單上各控件的依賴關系的地方。如果是一個開發小組在進行共同開發,嚴格地要求每個成員為每個單元文件寫上“<SPAN
lang=en-us>Diagram</SPAN>”,可以更好地實現程序員之間的溝通。</P>
<P><SPAN lang=en-us>CB5</SPAN>沒有這些,不過下面的熱鍵操作兩個版本均一樣的,要求大家記住。</P>
<P>按<SPAN lang=en-us> Ctrl + F6
</SPAN>可以在源文件和頭文件之間來回切換。請大家試試。這個簡單的操作將在我們今后的編程過程中高頻率地使用。</P>
<P> </P>
<H3><A name=14.2>14.2</A> 如何創建多個單元文件</H3>
<P> </P>
<P>前面我們在“<SPAN
lang=en-us>Windows</SPAN>應用程序工程”中看到了頭文件與源文件的匹配關系,在“控制臺”的工程中,也同樣存在。不過由于控制臺經常只用來寫一些小小的程序,所以往往只需一個源文件即可。由于只有一個源文件,所以也就不存在函數、數據在多個文件之間“共享”的需要,因此邊頭文件也就可以不提供。</P>
<P> </P>
<P>那么,是不是只有在程序很大,或者只有在有很多人同時開發一個軟件時,才需要多個源文件呢?</P>
<P><SPAN
lang=zh-cn>這就好像你家里只有兩本書:《紅樓夢》和《格林童話》,是把它們放在同一個抽屜里呢?還是分開放到兩個抽屜里?我覺得后者是比較好的選擇。因為我們常常希望家里看《格林童話》的人,最好不要去看《紅樓夢》。</SPAN></P>
<P><SPAN lang=zh-cn>程序也一樣,最好把不同的邏輯實現,放到不同的源文件中。</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>下面我們做一個實例。例子的代碼我們都已經學過。目標是實現一個可以求統計值和平均值的程序。</SPAN></P>
<P><SPAN lang=zh-cn>根據我們現在所學的情況,我把這個工程中的代碼分為三個源代碼:</SPAN></P>
<P><SPAN lang=zh-cn>其一:主程序。就是</SPAN>main()<SPAN
lang=zh-cn>函數所在的代碼。這個源文件實現總的流程。我將該文件取為</SPAN> main.cpp<SPAN
lang=zh-cn>。</SPAN></P>
<P><SPAN
lang=zh-cn>其二:計算總和及計算平均值的代碼。這個源文件負責用戶計算過程,也包括每個過程所需輸入輸出。該文件將被存盤為</SPAN>mainfunc.cpp<SPAN
lang=zh-cn>。</SPAN> <SPAN lang=zh-cn>意為主要功能。</SPAN></P>
<P><SPAN lang=zh-cn>其三:</SPAN> assifunc.cpp<SPAN
lang=zh-cn>。表示輔助功能函數所在代碼。它只提供一個函數:將用戶輸入的大寫或小寫的字母</SPAN>'Y'<SPAN
lang=zh-cn>或</SPAN>'N' <SPAN lang=zh-cn>確保轉換為大寫。這個函數將</SPAN>main()<SPAN
lang=zh-cn>主函數內</SPAN>,<SPAN lang=zh-cn>判斷用戶是否繼續時用到。</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>新CB新建一個控制臺程序(如果你還開著上個程序,先選</SPAN>File | Close All<SPAN
lang=zh-cn>關閉它)。CB會自動生成第一個文件,不過現在的名字為“</SPAN>Unit1.cpp"<SPAN
lang=zh-cn>。</SPAN></P>
<P><SPAN lang=zh-cn>接下來是一項新工作,我們來添加兩人新的單元文件,即上面說的“其二”和“其三”。</SPAN></P>
<P><SPAN lang=zh-cn>CB6 :</SPAN>File | New | Unit<SPAN
lang=zh-cn>;CB5:</SPAN>File | New Unit<SPAN lang=zh-cn>。</SPAN></P>
<P><SPAN lang=zh-cn>請進行兩次以上操作,CB將為我們生成新的兩個單元文件:</SPAN>Unit2.cpp<SPAN
lang=zh-cn>和</SPAN>Unit3.cpp<SPAN lang=zh-cn>。大家可以再試試</SPAN> Ctrl +
F6<SPAN lang=zh-cn>。</SPAN>(<SPAN
lang=zh-cn>注意,第一個單元文件:</SPAN>Unit1.cpp<SPAN lang=zh-cn>
沒有配套的</SPAN>.h<SPAN lang=zh-cn>文件,所以不要在該文件里嘗試</SPAN>Ctrl + F6)<SPAN
lang=zh-cn>。</SPAN></P>
<P><SPAN lang=zh-cn>然后選擇</SPAN>File | Save All<SPAN
lang=zh-cn>。全部存盤,最好不要存在</SPAN>CB<SPAN
lang=zh-cn>默認的目錄下。記得按以下關系重命名:</SPAN></P>
<P>Unit1.cpp <SPAN lang=zh-cn>存盤為</SPAN> main.cpp<SPAN
lang=zh-cn>;</SPAN></P>
<P>Unit2.cpp <SPAN lang=zh-cn>存盤為 </SPAN>mainfunc.cpp<SPAN
lang=zh-cn>;</SPAN></P>
<P>Unit3.cpp <SPAN lang=zh-cn>存盤為 </SPAN>assifunc.cpp<SPAN
lang=zh-cn>;</SPAN></P>
<P><SPAN lang=zh-cn>至于總的工程,隨你便,我圖方便,還是叫</SPAN>:Project1.bpr<SPAN
lang=zh-cn>。</SPAN></P>
<P> </P>
<P><IMG src="教學--第十四章 程序的文件結構.files/ls14.h1.jpg" align=left border=0><SPAN
lang=zh-cn>(現在我們第一次在一個工程中用到多個源文件。所以你得學會如何快速打開一個工程中某個源文件——當然,現在這三個文件都已經打開著,不過假設你有點事關閉CB,我們不希望下回打開這個工程時,你“找”不到第2和第3個文件了——請點擊CB工具欄上的這個圖標:<IMG
src="教學--第十四章 程序的文件結構.files/ls14.h3.gif"
border=0>,將出現源文件列表對話框,如左圖)</SPAN></P>
<P> </P>
<P> </P>
<P>接下來講在這三個文件中,我們分別寫些什么?大多數代碼我們都已經在前面學過,所以我對代碼的功能不作太多的解釋。我們的重點是:三個源文件之間的代碼如何實現“溝通”。</P>
<P> </P>
<P><B>第一個文件:main.cpp</B> 用來實現程序的主流程。</P>
<P><SPAN lang=zh-cn>在 main.cpp 中的main()函數內,我們加入代碼。</SPAN></P>
<P> </P>
<P>#include <iostream.h></P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -