作者zlw (洞房不敗)
看板C_and_CPP
標題Re: [問題] extern "C"的問題
時間Wed Jun 10 06:03:53 2009
1F:→ QQ29:謝謝不過 1154那篇 為什麼最後說把header宣告包起來呢!06/09 23:43
2F:→ QQ29:一定會有.c去include不是嘛@@06/09 23:44
原文太亂,簡單整理一下好了,部份內容也許有錯,保持懷疑態度觀看即可
確定搞懂這些觀念:
1. 函數定義、函數宣告 為何
2. 為何有 函數只能定義一次,但可宣告多次 的說法
3. 標頭檔的目的,以及編譯器如何處理
4. 假設 某外部函數 沒有原型宣告,為什麼仍可呼叫他 (連結器;C與C++)
5. 函數重載是什麼、C++為什麼可以、C為什麼不可以
6. extern 與 extern "C",如何影響編譯器、連結器的行為
--
你的 test.h 裡面內容應該是 test.c 裡面函數的原型宣告。
其他人 需要呼叫 test.c 裡的函數時,才 include 之。
因此 main.cpp 應該 include 而 test.c 不需要 include
※ 以下 AM 12:57 修文補充:
此例中的 test.c 程式碼裡,可以『不需要』include "test.h" 也能正常編譯。
但在程式開始把 test.h 編譯進去還是比較適當、妥善的作法。
--
你想要用 C++ 程式碼 呼叫「C 的程式碼所撰寫、編譯的函數」
所以在 main.cpp 要 include 其原型宣告所在時
必須做
extern "C"{
#include "test.h"
}
--
文件:
http://blog.anglee.org/2007/02/extern-c.html (寫的比較亂,但有完整範例收集)
http://blog.csdn.net/wfwd/archive/2006/05/30/763734.aspx
http://en.wikipedia.org/wiki/Name_mangling
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.128.232
※ 編輯: zlw 來自: 124.8.128.232 (06/10 06:09)
3F:推 QQ29:謝謝 我問一下 因此 main.cpp 應該 include 而 test.c 不需要 06/10 12:08
4F:→ QQ29:這樣意思是 如果我test.c要用到typedef struct xxx; 06/10 12:08
5F:→ QQ29:我struct定義必須寫在.c裡面而 .h只能夠寫宣告 使得.c不必 06/10 12:09
6F:→ QQ29:include .h~~這樣嗎? 不過我不太知道怎麼寫宣告struct 06/10 12:09
7F:→ QQ29:如果是class 我就直接寫 class A;這樣...struct不清楚耶!? 06/10 12:10
8F:推 QQ29:剛剛亂寫結果是 typedef struct FOO{}F; .h就只寫struct F; 06/10 12:23
9F:→ QQ29:就可以了!! 06/10 12:23
10F:→ zlw:struct就視為class處理,如果是這種狀況,就把struct放test.h 06/10 12:45
11F:→ zlw:test.c再去include "test.h" 06/10 12:46
12F:→ zlw:我原本意思是.c不必include一個標頭檔,內容裡都是自己的宣告 06/10 12:48
13F:→ zlw:現在仔細想想,這也不對,因為.c檔裡如果也有function call是 06/10 12:49
14F:→ zlw:用到定義在很後面的函數,這時候一開始把原型宣告放進就有必要 06/10 12:49
※ 編輯: zlw 來自: 124.8.128.232 (06/10 12:58)
15F:推 QQ29:我現在把struct定義寫在.c .h只有寫struct 宣告 這樣ok耶 06/10 13:27
16F:→ QQ29:這樣.c就不用include .h了的樣子 06/10 13:28