[問題] extern "C"的問題

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2009/06/09 21:43), 編輯推噓6(6024)
留言30則, 6人參與, 最新討論串1/5 (看更多)
大家好 因為在幫同學debug 他遇到的問題是他抓到的code是 C寫的副檔名是.c 他是用vc8寫的 我沒有實際解決這問題過但是我大概知道要使用extern "C" 我參考1514篇最下面講的方法 把函式宣告都用 extern "C"{宣告}包起來 以下是我測試的code main.cpp ======== #include <iostream> using namespace std; #include "test.h" int main() { foo(); system("PAUSE"); return 0; } test.c ======== #include "test.h" void foo(){ printf("@@"); } test.h ======== #ifndef _TEST_H #define _TEST_H #include <stdlib.h> #include <stdio.h> extern "C"{void foo();} #endif 出現錯誤是...error C2059: 語法錯誤 : '字串' 就是extern那行..... 不太知道問題出在哪 也許也不是extern "C"的問題... 不過我想問一下 extern "C" 是用在c++(VC)程式 當副檔名是c時 要把函式宣告前面都加上extern "C"? 那如果有 typedef struct foo{....}f;之類的struct宣告也要包嘛? 有沒有可能會遇到什麼問題 也請版友給點意見@@ 因為我同學遇到的bug實在太奇怪 http://140.113.207.187/q.PNG
錯誤訊息 跟他抓到的函式 不清楚他錯誤訊息表達什麼....... 他已經把.h檔案用extern "C" 只包函式宣告 剛又想到 如果程式另一個cpp裡面有函式foo的定義 他會認哪一個? 或是可以指定呼叫c還是c++的 函式呢?? 以上 請教各位謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.207.187 ※ 編輯: QQ29 來自: 140.113.207.187 (06/09 21:45)

06/09 21:56, , 1F
呃,C的部分不用 extern,是 C++ 用到 C 的東西才要
06/09 21:56, 1F

06/09 21:56, , 2F
extern "C",你的作法好像反過來了
06/09 21:56, 2F

06/09 21:57, , 3F
有興趣去查一下 name mangling
06/09 21:57, 3F

06/09 22:02, , 4F
喔不是啦 我用VC8寫應該就是c++吧 只是我故意把檔名打成.c
06/09 22:02, 4F

06/09 22:03, , 5F
只是會出現那個錯誤.... 剛剛google找到另一個寫法寫在main()
06/09 22:03, 5F

06/09 22:03, , 6F
extern "C"{ #include "test.h"}....超奇怪 就過了
06/09 22:03, 6F

06/09 22:03, , 7F
不過 我再另一個.cpp 定義同樣名字的foo 也不會造成重複宣告
06/09 22:03, 7F

06/09 22:04, , 8F
讓我感到很疑惑 我又在main上方在宣告一次void foo();了
06/09 22:04, 8F

06/09 22:22, , 9F
VC不是看副檔名的,屬性->C/C++->進階->編譯為->選C或C++決定
06/09 22:22, 9F

06/09 22:23, , 10F
你一樣可以開個專案,檔名叫.c,但是編譯成C++
06/09 22:23, 10F

06/09 22:27, , 11F
我是看1154那篇講的耶 而且我寫.c 他就認不到這函式
06/09 22:27, 11F

06/09 22:27, , 12F
.cpp就ok@@
06/09 22:27, 12F

06/09 22:29, , 13F
我看了我專案屬性是填編成C++沒錯 但是副檔名好像會影響!
06/09 22:29, 13F

06/09 22:30, , 14F
但我不是很清楚 所以請大家指導
06/09 22:30, 14F

06/09 22:32, , 15F
VC 是會看副檔名的,如果你直接呼叫 cl.exe 的話
06/09 22:32, 15F

06/09 22:33, , 16F
嗯,大概是用IDE的時候,專案屬性的設定會優先拿來看
06/09 22:33, 16F

06/09 22:34, , 17F
專案屬性可以是C++,然後專案裡的某個123.cpp再屬性設成C也行
06/09 22:34, 17F

06/09 22:38, , 18F
不過位啥我會出現那個奇怪的 error呢? 還有什麼是呼叫cl.exe
06/09 22:38, 18F

06/09 22:39, , 19F
extern "C"主要是給C++拿來用,{}裡面應該主要是放函數宣告
06/09 22:39, 19F

06/09 22:40, , 20F
struct不是函數,應該不用吧(沒試過)。
06/09 22:40, 20F

06/09 22:56, , 21F
我是這樣寫阿 但是那個錯誤我就不懂為什麼了 改成我推文的包
06/09 22:56, 21F

06/09 22:56, , 22F
法 就可以成功 但是推文的包法 就是包全部.h的內容的感覺
06/09 22:56, 22F

06/09 23:12, , 23F
如果是實作用C用的header檔裡面用#ifdef __cplusplus
06/09 23:12, 23F

06/09 23:12, , 24F
呃...我拿你原文的去編譯看看,可能有IDE視覺效果比較好,才發
06/09 23:12, 24F

06/09 23:12, , 25F
把extern "C"包起來
06/09 23:12, 25F

06/09 23:13, , 26F
現是你的extern "C"用法錯誤,他是給C++用的,你不能在C裡用
06/09 23:13, 26F

06/09 23:13, , 27F
你的test.c有include到test.h,就會把extern "C"加進去
06/09 23:13, 27F

06/09 23:43, , 28F
謝謝不過 1154那篇 為什麼最後說把header宣告包起來呢!
06/09 23:43, 28F

06/09 23:44, , 29F
一定會有.c去include不是嘛@@
06/09 23:44, 29F

06/09 23:51, , 30F
你真的有搞懂 extern "C" 是做什麼的嗎?
06/09 23:51, 30F
文章代碼(AID): #1ABcRoE5 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1ABcRoE5 (C_and_CPP)