線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1118
推到 Plurk!
推到 Facebook!

請前輩指點一下include struct的方法

答題得分者是:richtop
achillean
一般會員


發表:16
回覆:23
積分:7
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-29 11:15:04 IP:220.143.xxx.xxx 未訂閱
不太瞭解BCB的函示怎麼分別寫在不同的CPP檔裡然後include近來用 所以所有的函示都寫在同一個Unit1.cpp(爆!) 現在實在看不下去了,想要把函示拆開 原本 unit1.h宣告的
typedef struct A{
..
}A;    typedef struct B{
A a;
}B;    B* readB(..);    void somefun(B b);
我想把readB和somefun這兩個function分別拉到Unit2,Unit3 我想struct A,B應該也放到Unit2比較好還是留在原本的Unit1? anyway我嘗試過多種排列組合 Unit2.h宣告了structA,B,readB的phototype Unit2.cpp定義structA,B,readB的內容 somefun還沒搬走情況 Unit1.h宣告了somefun的phototype以及include Unit.cpp定義了somefun的內容 編譯之後出現somefun之中未定義struct B的錯誤訊息 諸如以上各種搬來搬去,include Unit1.h,Unit1.cpp,Unit2.h,Unit2.cpp 始終摸不出正確的方法 煩請前輩指點一二,問題如有交代不清,請告知,我會再詳細補上。
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-29 22:09:49 IP:61.221.xxx.xxx 未訂閱
引言: 不太瞭解BCB的函示怎麼分別寫在不同的CPP檔裡然後include近來用 所以所有的函示都寫在同一個Unit1.cpp(爆!) 現在實在看不下去了,想要把函示拆開 原本 unit1.h宣告的
typedef struct A{
..
}A;    typedef struct B{
A a;
}B;    B* readB(..);    void somefun(B b);
我想把readB和somefun這兩個function分別拉到Unit2,Unit3 我想struct A,B應該也放到Unit2比較好還是留在原本的Unit1? anyway我嘗試過多種排列組合 Unit2.h宣告了structA,B,readB的phototype Unit2.cpp定義structA,B,readB的內容 somefun還沒搬走情況 Unit1.h宣告了somefun的phototype以及include Unit.cpp定義了somefun的內容 編譯之後出現somefun之中未定義struct B的錯誤訊息 諸如以上各種搬來搬去,include Unit1.h,Unit1.cpp,Unit2.h,Unit2.cpp 始終摸不出正確的方法 煩請前輩指點一二,問題如有交代不清,請告知,我會再詳細補上。
achillean 你好: 善用本站的搜尋功能,請參考以下的連結文章 src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10003806&CC=223734"> -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-29 22:11:05 IP:211.76.xxx.xxx 未訂閱
achillean 您好:    理論上用include其實就是把該檔案的內容通通含括進來。而通常的習慣是把函式原型(prototype)宣告定義放在.h檔中,而實作或者說函式的內容則放在.c或.cpp中。 由於依您所提可能的組合有許多種,所以底下提供一個個人的經驗習慣供您參考:    1.建議將所有的typedef定義放在一起, 例如將下列自定型態存於"myHeader.h"中,
#ifndef MY_HEADER  // 讓同一引用此檔案的程式中,下列定義只會出現一次
  #define MY_HEADER
typedef struct tagA{
..
} A;  // 讓自定型態A與結構struc A能有所區分,建議改成struct tagA(其它名稱亦可)    typedef struct tagB{
A a;
}B;    #endif
2.接著不管函式要定義在哪個檔案中,只要先在檔案開始處引用"myHeader.h"即可,
a) 
  // unit2.cpp
  #include "myHeader.h"
  // ....
  B* readB(..);
  
  
  // unit3.cpp
  #include "myHeader.h"
  // ....
  void somefun(B b);    b)
  // unit2.cpp
  #include "myHeader.h"
  // ....
  B* readB(..);
  void somefun(B b);   
使用時,要將自己定義的.h與所有的.c放在相同的目錄中,並且include時,.h檔前後要用雙引號(")括住。
renth555
一般會員


發表:32
回覆:65
積分:19
註冊:2003-02-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-01 02:19:12 IP:61.56.xxx.xxx 未訂閱
對不起發問一下 #ifndef MY_HEADER // 讓同一引用此檔案的程式中下列定義只會出現一次 #define MY_HEADER // 這兩句語法意思是甚麼小弟不了解 typedef struct tagA{ ----> 跟取 struct tagA 這樣有何不同 .. } A; #endif
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-01 11:31:54 IP:211.76.xxx.xxx 未訂閱
引言: 對不起發問一下 #ifndef MY_HEADER // 讓同一引用此檔案的程式中下列定義只會出現一次 #define MY_HEADER // 這兩句語法意思是甚麼小弟不了解 有時候您同時需要include很多檔案,也很有可能這些檔案彼此又有相互include的情形發生,因此,會發生重複定義的錯誤。 所以解決的辦法就是透過編譯指令#ifndef...#endif ,像這樣:先檢查 MY_HEADER (可以是其他的自定文字)是不是存在,如果不存在就定義MY_HEADER;如此一來,當其他有再include此檔時,因MY_HEADER已經存在,所以就不會再將.h的內容放進來,保持只有一份.h的內容,而不管您在同一個檔案中include它幾次。 typedef struct tagA{ ----> 跟取 struct tagA 這樣有何不同 .. } A; typedef可以讓您使用定義變數的方式去定義您的自定資料型態,也就是說您經由typedef定義的那個"變數",就成了一個新的自定資料型態,個人覺得typedef是個非常重要的自定型態使用方法。 試著看下述例子:(您應該可以知道您要的答案了) < class="code">void __fastcall TForm1::Button1Click(TObject *Sender) { int myData; typedef int myType; myType a, b; a=10; b=20; myData=30; } #endif
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/09/01 23:37:04
renth555
一般會員


發表:32
回覆:65
積分:19
註冊:2003-02-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-05 15:52:21 IP:61.56.xxx.xxx 未訂閱
謝謝 richtop 小弟了解 typedef int myType; 自定義資料形態意思了 但我還是不太了解(小弟不才是否有更簡單範例解釋呢 感激教導) #ifndef MY_HEADER ----> ? #define MY_HEADER ----> ? typedef struct AAA { .. }A; #endif
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-05 16:52:05 IP:211.76.xxx.xxx 未訂閱
renth555 您好:    
引言: 小弟了解 typedef int myType; 自定義資料形態意思了 但我還是不太了解(小弟不才是否有更簡單範例解釋呢 感激教導) #ifndef MY_HEADER ----> ? #define MY_HEADER ----> ? ..... #endif
您可以在BCB中開啟一個新的Application,並觀察Unit1.h,您將發現其前後也有類似宣告: //--------------------------------------------------------------------------- #ifndef Unit1H // --> 如果程式中之前都沒有定義(define)"Unit1H"的話,就將這行以下到#endif之前的內容複製進來。 #define Unit1H // --> 在此處定義(define)"Unit1H" ............ #endif // --> 表示上述的編譯判斷到此為止 如果您將上述三行註解掉,並且在Unit1.cpp中,故意再重複打一次#include "Unit1.h", ..... #include "Unit1.h" #include "Unit1.h" // 故意多打一次 ..... 接著執行此結果,您將得到重複宣告Form1的錯誤,原因是include會將指定要include進來的Unit1.h的內容複製一份進來,所以當您再include相同的東西時,其實就又再複製一份進來,因此就重複了。 但如果在include前,先判斷這個部分之前是否已include進來過了?如果是的話,也就是說已經定義了"UNIT1H",就跳過或者說不把Unit1.h的資料複製進來,因此避免了資料重複載入的問題。
系統時間:2024-05-08 13:22:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!