我寫了一個C++函數,我需要從C程序調用。爲了使它可以從C中調用,我在功能聲明上指定了extern "C"
。然後我編譯了C++代碼,但編譯器(Dignus Systems/C++)爲該函數生成了一個mangled name。所以,它顯然沒有兌現extern "C"
。僅在函數聲明中需要extern「C」嗎?
要解決此問題,我將extern "C"
添加到函數定義。在此之後,編譯器生成可從C中調用的函數名稱。從技術上講,extern "C"
只需要在函數聲明中指定。這是正確的嗎? (C++ FAQ Lite就是一個很好的例子。)你是否也應該在函數定義中指定它?
下面就來演示這樣的例子:
/* ---------- */
/* "foo.h" */
/* ---------- */
#ifdef __cplusplus
extern "C" {
#endif
/* Function declaration */
void foo(int);
#ifdef __cplusplus
}
#endif
/* ---------- */
/* "foo.cpp" */
/* ---------- */
#include "foo.h"
/* Function definition */
extern "C" // <---- Is this needed?
void foo(int i) {
// do something...
}
我的問題可能是不正確編碼的東西的結果,或者我可能已經找到了編譯器錯誤。無論如何,我想諮詢一下stackoverflow,以確保我知道哪個技術上是「正確」的方式。
如果您在示例代碼中顯示foo.c中的外部「C」,您確定實際上獲得了foo的篡改嗎?或者這只是其他更復雜的代碼中發生的事情?我經常將這個問題看作是忘記在foo.c中包含foo.h的一個症狀。 – 2009-09-04 19:01:26
@布魯克斯摩西:這是一個很好的觀點。在我的實際代碼中,比這個「foo」示例稍微複雜一點,我在「cpp」源文件中包含頭文件。 是什麼讓我覺得編譯器改變名字是這樣的:如果我沒有在函數定義中包含'extern「C」',那麼編譯器列表顯示外部符號「foo_FPFPCc_v」。當包含「extern」C「'時,列表顯示外部符號」foo「。 – bporter 2009-09-04 19:41:58
@bporter - 嘗試使用簡化示例的編譯器可能會很有趣。如果它顯示相同的行爲,那麼您可能需要向供應商發送便條。如果它沒有顯示相同的內容,那麼你應該跟蹤你真正的構建中發生了什麼,因爲這會表明錯誤的頭部被引入(或者其他的東西使得函數聲明被遺漏)。 – 2009-09-04 19:53:24