C 程式的開發流程 (以命令列方式解釋)
TURBO C IDE
在以 Turbo C IDE
(整合式發展環境,Integrated development envinonment)
開發程式時 edit, compile, link 完畢後在 output 目錄裡你會看到
xxx.obj xxx.exe 兩個檔案
(如果你的程式叫做 xxx.c 的話)
這兩個檔案各是在哪一個步驟產生的呢?
其內容為何?
TURBO C IDE 環境的方便性隱藏了不少的細節,
這些對於專業的資訊人員來講卻都是需要知道的知識。
發展一個程式的步驟
發展一個程式的步驟如下圖:
Turbo C / Borland C IDE 環境裡很容易讓你誤以為程式寫好就可以執行了,
其實中間有許多步驟。
命令列編譯器與連結器
以下我們利用 Turbo C/C++ 的命令列編譯器 tcc.exe
(或是 Borland C/C++ 的命令列編譯器 bcc.exe)
實作二個範例程式來說明編譯連結執行的過程:
範例一:
列印函式 f(x) = 3x^3 - 7.5x^2 + x - 2
自 x=-5 至 x=5 每隔 0.1 的函式值
test1.c
#include <stdio.h>
void main(void)
{
double fx;
double x;
for (x=-5.0; x<=5.001; x+=0.1)
{
fx = 3.0*x*x*x - 7.5*x*x + x -2.0;
printf("f(%lf)=%lf\n",x ,fx);
}
}
-
步驟一:請利用筆記本 (或是 Turbo C 編輯器) 編輯 test1.c 程式,
將上列程式拷貝進來,並存檔於適當目錄中。
-
步驟二:在 MSDOS 模式視窗裡利用 cd , dir 等指令找到 test1.c 程式
(例如: C:\user\yourname\cprog\ 目錄中)
-
步驟三:在 MSDOS 模式視窗裡鍵入 bcc /c test1.c
(或是 在 Turbo C 環境中 tcc /c test.c)
來編譯此程式,
此時編譯器會檢查程式語法,
分析程式究竟要做些什麼,
並且產生程式對應的機器指令碼,
置於 test.obj 檔案內。
注意:
進行此步驟時你很可能會得到錯誤訊息,
例如:
"Bad command or filename",
這是因為 MSDOS 找不到 bcc.exe,
當然這個檔案不在你現在所在的目錄,
你可以鍵入 set 命令,
注意 path= 之後一連串以分號分隔的路徑名稱是
MSDOS 依次尋找 bcc.exe 的路徑,
只要 bcc.exe 在其中任何一個目錄中,
你就不會得到上面的錯誤,
所以我們必須將 c:\language\bc301\bin 這個路徑利用
set path = %path%;c:\langeage\bc301\bin 加入 path 環境變數中,
接下來你可能會遇見
"Unable to open include file 'stdio.h'"
這樣子的訊息,
這是因為 stdio.h 在 Borland C
系統的目錄中而不在你的目錄中,
你必須利用 bcc -Ic:\language\bc301\include 來編譯才行。
-
步驟四:
在 MSDOS 模式視窗內鍵入 bcc test1.obj 來連結此程式,
產生 test1.exe 執行檔案,
不要看此命令只有給一個參數 test1.obj
以為單由 test.obj 可以產生 test1.exe ,
錯了!
還有許多函式庫,
在 BORLAND C 中還有像 CS.LIB, MATHS.LIB
等等存放在 c:\language\bc301\lib
目錄內的函式庫,
這些函式庫包含了像 scanf(), printf() 這類 C 的標準函式。
注意:
和前一個注意事項一樣,
你會遇見類似 "Unable to open file c0s.obj"
這樣的錯誤訊息,
這是因為 c0s.lib 檔案 (內含 c0s.obj) 也是在 Borland C 的
系統目錄 c:\language\bc301\lib 中而不在你目前所在的目錄中,
所以你該用
bcc -Lc:\language\bc301\lib test1.obj 才能夠順利產生 test1.exe
-
步驟五:
載入及執行,
直接在 MSDOS
模式視窗內鍵入
即可將執行程式由磁碟機載入記憶體中並且開始執行。
範例二:
上一個例子是把程式放在單一檔案中,讓我們嘗試一個多檔案的 C 程式,
我們刻意將前一個範例拆開到兩個檔案中如下:
---------------------------------------------------
test2a.c
---------------------------------------------------
#include <stdio.h>
double func(double x);
void main (void)
{
double fx;
double x;
for (x=-5.0; x<=5.001; x+=1)
{
fx = func(x);
printf("f(%lf) = %lf \n", x, fx);
}
}
----------------------------------------------------
test2b.c
----------------------------------------------------
double func(double x);
{
double y;
y = 3.0*x*x*x - 7.5*x*x + x -2.0;
return y;
}
-
步驟一:請使用筆記本 (或是 Turbo C 編輯器)
編輯 test2a.c 及 test2b.c 程式,
並存檔於適當之目錄中。
-
步驟二:個別編譯 test2a.c 及 test2b.c
bcc -I c:\language\bc301\include test2a.c
bcc -I c:\language\bc301\include test2b.c
會產生 test2a.obj 及 test2b.obj
-
步驟三:連結 test2a.obj, test2b.obj 及其它系統函式庫
bcc -L c:\language\bc301\lib test2a.obj test2b.obj
會產生 test2a.exe
-
步驟四:載入及執行,請鍵入
即可。
注意:
設計 C/C++ 程式時為什麼要分為好幾個檔案呢?
-
檔案為 C 程式中基本的模組單位,
程式設計者可以把目的、性質接近的 C 程式碼放在同一個檔案中,
使得性質不同的程式碼不會互相干擾,
需要的話兩個不同檔案的 C 程式碼中甚至可以使用相同的變數名稱及函式名稱
(需要加上 static 宣告)。
-
一個大的 C 程式可以有幾十萬列程式,
若是你只放在一個 C 程式檔中,
一旦你修改某一列程式後,
你需要重新編譯全部程式碼,
這需要很多時間,
雖然你知道大部分的時間是完全浪費的,
但是 complier 不知道你到底在哪裡做了修改,
只好全部編譯一遍,
若是你自己分為許多個小檔案,
例如此範例中若只修改
test2b.c 則只需編譯 test2b.c,
test2a.c 不需要再編譯,
只需要做連結的動作就好了。
-
Turbo C IDE 環境中也可以用所謂的專業檔 (project)
來處理多個檔案的 C 程式,
步驟請參考如何製作 Turbo C IDE 環境下的專案。
注意:
Turbo C 及 Borland C 中可以將編譯及連結以
bcc -I c:\language\bc301\include
-L c:\language\bc301\lib test2a.c test2b.c
直接解決,
其實 bcc 程式還是順序地做編譯及連結兩個動作,
還是會產生 test2a.obj , test2b.obj, test2a.exe 三個檔案,
但是你只需要下一道命令即可。