模組化問題 |
答題得分者是:derrenbol1
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
將一個程式模組化 把部分資料 & 函式在宣告標頭檔中 下面是書中程式碼是三個檔案
/* 程式範例: Ch1-4.h */ #define MAXCMP 1 #define MINCMP 0 /* 外部變數宣告 */ extern int var1; extern int var2; /* 顯示整數變數的比較結果 */ extern void cmpresult(int); /* 程式範例: Ch1-4.c */ #include1.程式進入點不是從main()開始為何不是把int var1, var2; 宣告在Ch1-4m.c 檔中 而是宣告在 ch1-4.c?? 2.程式中並沒有在ch1-4m.c 宣告 int var1, var2; 而又可以在ch1-4.c中宣告的 ,為什麼可以直接把值指定給兩個變數?? var1 = 45; /* 指定變數 */ var2 = 100; 把ch1-4.c中的int var1 , var2拿掉改成下面直接在ch1-4m.c宣告後直接給初始值這樣為什麼不可以?? /* 主程式 */ int main() { int var1 = 45; int var2 = 100; cmpresult(MINCMP); cmpresult(MAXCMP); system("PAUSE"); return 0; }3.讓我感覺是先從ch1-4.c 執行後在執行 ch1-4m.c 這程式執行順序怎 麼跑的?? 4.還有在ch1-4.c 特別使用static來宣告變數??用一般變數不可以嗎?? static 變數只能在該檔案使用~~檔案只有ch1-4.c 算是一個檔案, 還是整個ch1-4.c & ch1-4m.c & Ch1-4.h 算是一個檔案?? 謝謝 發表人 - syao 於 2005/10/13 11:16:49 發表人 - syao 於 2005/10/13 11:19:10 發表人 - syao 於 2005/10/13 11:27:31 |
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
To syao: 1. 將var1及var2宣告在Ch1-4.c就是要告訴讀者, 全域變數
在跨模組是可以使用的, 藉由Ch1-4.h中
extern int var1; extern int var2;的宣告讓其他引入此Header檔的模組都能使用var1及var2. 2. 像你這樣寫的話: /* 主程式 */ int main() { int var1 = 45; int var2 = 100; cmpresult(MINCMP); cmpresult(MAXCMP); system("PAUSE"); return 0; }是在main中宣告兩個區域變數var1及var2, 所以你給的初值 是給區域變數, 並非設定到全域變數var1及var2;compresult 函數會將全域變數var1及var2的值印到螢幕上, 你可以看一下 是不是你設的初值. 3. C的程式都是從main開始的, 你可以在main函數中, 呼叫compresult 之前先printf一個訊息, 你就會知道誰先被執行. 4. Ch1-4.c, ch1-4m.c是兩個不同的檔案;像ch1-4.c中宣告了一個 全域變數result, 但它的前面多了個static, 所以你在ch1-4m.c 中的函數不得引用result, 你可以在main函數中也指定result初 值試試看, 鏈結時就會出現error. |
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
derrenbol1謝謝你 我還有兩個問題 1.我將Ch1-4.h中的extern void cmpresult(int);此行拿掉 只將void cmpresult(int);加到Ch1-4m.c ,Ch1-4.c不加 , 這樣編譯可以成功 但是換成只到Ch1-4.c 中 , Ch1-4m.c不加這樣編譯就無法通過 這是什麼原 因?? 2. 在Ch1-4.c & Ch1-4m.c 中分別引入兩個相同的標頭檔這樣不發生衝突嗎???不能只在其中一個檔案引入標頭檔後就可以讓其他檔案一起共用嗎??需要每個檔案都需要引入標頭檔嗎?? 還是標頭檔裡面都是做宣告而已所以不會發生衝突這是我的想法 .... 但在標頭檔中做宣告動作是要讓編譯器知道什麼訊息嗎??? 謝謝 發表人 - syao 於 2005/10/15 10:07:31 發表人 - syao 於 2005/10/15 10:08:30
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
To syao: 1. 函數也可以是static的. 而且有些編譯器的預設就是
static. 所以你若不加extern void compresule(int);
的話, 這種編譯器會發出Error, 有些編譯器則頂多是
給個警告而已, 並不影響後續的編譯行為. 2. 當兩個文件檔(*.c)同時引入相同的標頭檔時, 一般的
巨集定義(#define)並不會造成編譯錯誤; 因為編譯器
同時間只會編譯一個文件檔, 所以當編譯器正在編譯
xxx.c時, 該標頭檔所定義的巨集或常數, 只有用在該
文件檔中; 在標頭檔中撰寫一些常用的巨集是節省設
計人員在開發上的時間, 因為你就不用在每個文件檔
中作相同的巨集定義, 只要引入該標頭檔即可. 但得
注意的是, 千萬不要在標頭檔內宣告變數, 因為未指
定static的變數, 在整個程式專案內, 該變數名稱要
是唯一, 否則編譯器會產生重複定義的錯誤. 請參考.
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |