Re: [問題] 在Visual C++用extern

看板C_and_CPP (C/C++)作者 (好人超)時間15年前 (2011/06/22 16:58), 編輯推噓10(10021)
留言31則, 11人參與, 最新討論串2/2 (看更多)
※ 引述《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

06/22 16:59, , 1F
超哥,我有疑問此code不是已經用typedef了嘛?為何
06/22 16:59, 1F

06/22 17:00, , 2F
A.cpp中還要用struct A去宣告變數a?
06/22 17:00, 2F
如你所說,把 struct A 改成 A 的話是沒有錯的 不過這個跟「extern」與「無法解析外部符號」這個問題無關 所以我就保留原程式碼的寫法了 ※ 編輯: james732 來自: 140.117.171.46 (06/22 17:02)

06/22 17:03, , 3F
謝謝,我試試看
06/22 17:03, 3F

06/22 17:05, , 4F
<m.m>
06/22 17:05, 4F

06/22 17:06, , 5F
超哥必推!
06/22 17:06, 5F

06/22 17:08, , 6F
我剛剛把整個struct重新在test.cpp宣告,再用extern
06/22 17:08, 6F

06/22 17:09, , 7F
宣告一次,發現這樣也可以。只是沒那麼正規XD
06/22 17:09, 7F

06/22 17:09, , 8F
你確定......?
06/22 17:09, 8F

06/22 17:10, , 9F
我希望你能很清楚的知道extern, typedef, include的作用
06/22 17:10, 9F

06/22 17:11, , 10F
= =嗆你一下,如果你在test.cpp宣告好,幹麼還要用extern?
06/22 17:11, 10F

06/22 17:14, , 11F
我也是剛剛亂試的,本來struct只想到宣告在一個檔裡
06/22 17:14, 11F

06/22 18:06, , 12F
去念念ADT吧 =..=
06/22 18:06, 12F

06/22 18:57, , 13F
都寫c++了typedef是不是可以省略?
06/22 18:57, 13F

06/22 19:06, , 14F
都寫c++了 .h是不是可以省略?
06/22 19:06, 14F

06/22 19:15, , 15F
有副檔名還是比較好的,作業系統比較好判別檔案的類型
06/22 19:15, 15F

06/22 19:22, , 16F
~"~typedef和.h跟c++無關...
06/22 19:22, 16F

06/22 20:22, , 17F
static,extern,原原po可能要再了解這二個keyword特性.
06/22 20:22, 17F

06/22 20:59, , 18F
header檔跟是不是C++無關阿
06/22 20:59, 18F

06/22 21:04, , 19F
我是回答省略的問題...不是寫c++,那些東西就可省略
06/22 21:04, 19F

06/22 21:26, , 20F
typedef 可以省沒錯啊 而且也應該要省
06/22 21:26, 20F

06/22 21:28, , 21F
.h 則不應該省略,標準函式庫之所以省略有它的原因
06/22 21:28, 21F

06/22 21:34, , 22F
我的意思是c++跟省略那些東西無關,甚至.h根本不該省
06/22 21:34, 22F

06/22 21:51, , 23F
C 不能省略 typedef,所以這件事和 C++ 是有關的吧
06/22 21:51, 23F

06/22 21:55, , 24F
為什麼C++可以省略typedef呢?這塊我不懂,可以多講些嗎?
06/22 21:55, 24F
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)

06/22 21:57, , 25F
恩,這塊可以詳細點嘛? 因為我是昨天才搞懂extern.
06/22 21:57, 25F

06/22 21:58, , 26F
c不能省略typedef是這句,跟extern有關聯嗎?
06/22 21:58, 26F
完全是兩回事,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)

06/22 22:01, , 27F
<m.m>受教了
06/22 22:01, 27F
※ 編輯: james732 來自: 140.117.171.46 (06/22 22:02)

06/22 22:05, , 28F
真的不能推好人超嗎 A__A
06/22 22:05, 28F

06/22 22:07, , 29F
所以main.cpp裡面,可以用extern A a? 如果我沒理解錯誤
06/22 22:07, 29F
是啊,在C++裡面,那個 struct 是可以省略掉的 在 C 裡面只要有 typedef,也可以省略掉 struct ※ 編輯: james732 來自: 140.117.171.46 (06/22 22:08)

06/22 22:10, , 30F
<m.m>
06/22 22:10, 30F

06/23 09:06, , 31F
嗯,好人卡遞。C++應該是struct和class幾乎是同義的關係吧。
06/23 09:06, 31F
文章代碼(AID): #1E0QwcPj (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1E0QwcPj (C_and_CPP)