看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《chenroseyaks (小盜)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Visul C++ : 問題(Question): : 使用extern的時候一直出現無法解析外部符號, 但我已經有include需要的.cpp檔了 : 程式碼(Code):(請善用置底文網頁, 記得排版) : 在B.cpp中的宣告: : typedef struct A{ : ...... : }A; : -------------------------- : 在test.cpp中使用: : 宣告: extern struct A a; //struct A是在B.cpp檔中 : 呼叫: func(a); 比較正確的寫法 A.h typedef struct A { // .... }A; A.cpp #include "A.h" struct A a; test.cpp #include "A.h" extern struct A a; void func(struct A a) { // .... } int main() { func(a); } --------------- 還有很多種改法就是了...... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46
angleevil:超哥,我有疑問此code不是已經用typedef了嘛?為何 06/22 16:59
angleevil:A.cpp中還要用struct A去宣告變數a? 06/22 17:00
如你所說,把 struct A 改成 A 的話是沒有錯的 不過這個跟「extern」與「無法解析外部符號」這個問題無關 所以我就保留原程式碼的寫法了 ※ 編輯: james732 來自: 140.117.171.46 (06/22 17:02)
chenroseyaks:謝謝,我試試看 06/22 17:03
angleevil:<m.m> 06/22 17:05
xatier:超哥必推! 06/22 17:06
chenroseyaks:我剛剛把整個struct重新在test.cpp宣告,再用extern 06/22 17:08
chenroseyaks:宣告一次,發現這樣也可以。只是沒那麼正規XD 06/22 17:09
james732:你確定......? 06/22 17:09
james732:我希望你能很清楚的知道extern, typedef, include的作用 06/22 17:10
angleevil:= =嗆你一下,如果你在test.cpp宣告好,幹麼還要用extern? 06/22 17:11
chenroseyaks:我也是剛剛亂試的,本來struct只想到宣告在一個檔裡 06/22 17:14
xatier:去念念ADT吧 =..= 06/22 18:06
fjm31714:都寫c++了typedef是不是可以省略? 06/22 18:57
xatier:都寫c++了 .h是不是可以省略? 06/22 19:06
purpose:有副檔名還是比較好的,作業系統比較好判別檔案的類型 06/22 19:15
angleevil:~"~typedef和.h跟c++無關... 06/22 19:22
tropical72:static,extern,原原po可能要再了解這二個keyword特性. 06/22 20:22
youknowme09:header檔跟是不是C++無關阿 06/22 20:59
angleevil:我是回答省略的問題...不是寫c++,那些東西就可省略 06/22 21:04
littleshan:typedef 可以省沒錯啊 而且也應該要省 06/22 21:26
littleshan:.h 則不應該省略,標準函式庫之所以省略有它的原因 06/22 21:28
angleevil:我的意思是c++跟省略那些東西無關,甚至.h根本不該省 06/22 21:34
littleshan:C 不能省略 typedef,所以這件事和 C++ 是有關的吧 06/22 21:51
aecho:為什麼C++可以省略typedef呢?這塊我不懂,可以多講些嗎? 06/22 21:55
struct A { ... }; typedef struct B { ... } B; int main() { struct A a1; // C & C++ 寫這樣都可以 struct B b1; // C & C++ 寫這樣都可以 A a2; // 在沒有 typedef 的情況,C不能省略 struct,但C++可以 B b2; // 因為有 typedef,C & C++ 寫這樣都可以 } ※ 編輯: james732 來自: 140.117.171.46 (06/22 21:58)
angleevil:恩,這塊可以詳細點嘛? 因為我是昨天才搞懂extern. 06/22 21:57
angleevil:c不能省略typedef是這句,跟extern有關聯嗎? 06/22 21:58
完全是兩回事,extern 跟 typedef 並沒有什麼關聯。 這篇文裡面,在 A.cpp 裡面寫了 struct A a; 如果要在 main.cpp 裡面使用 A.cpp 裡的這個 a 就需要寫 extern struct A a; 代表這個 a 屬於別的外部檔案,而不是在 main.cpp 裡面 如果 main.cpp 裡面只寫了 struct A a; (沒有 extern 的話) 這樣就會再度宣告另一個 a 變數 連結的時候會出現重覆定義(A.cpp 與 main.cpp 都有個 a, 這樣是不可以的) ※ 編輯: james732 來自: 140.117.171.46 (06/22 22:02)
angleevil:<m.m>受教了 06/22 22:01
※ 編輯: james732 來自: 140.117.171.46 (06/22 22:02)
nowar100:真的不能推好人超嗎 A__A 06/22 22:05
angleevil:所以main.cpp裡面,可以用extern A a? 如果我沒理解錯誤 06/22 22:07
是啊,在C++裡面,那個 struct 是可以省略掉的 在 C 裡面只要有 typedef,也可以省略掉 struct ※ 編輯: james732 來自: 140.117.171.46 (06/22 22:08)
angleevil:<m.m> 06/22 22:10
aecho:嗯,好人卡遞。C++應該是struct和class幾乎是同義的關係吧。 06/23 09:06