前言:以前見到extern "c"這樣的語句,只是簡單地知道跟外部鏈結有關,但是沒有深刻理解它的意思。
首先,為什麼要使用extern "c"修飾符?
c++呼叫其它語言的函式,由於編譯器生成函式的機制不一樣,所以需要經過特殊處理,才可以呼叫。呼叫c語言的函式,需要在函式宣告的地方語句extern "c"。如果不使用該語句,在鏈結的時候,編譯器就會報以下這種錯誤。
test.obj : error lnk2019: 無法解析的外部符號 "void __cdecl deletestack(struct _node *)" (?deletestack@@yaxpau_node@@@z),該符號在函式 _main 中被引用。
然後是如何使用?
應該怎麼使用該語句呢?
剛開始,我簡單地在c++原始檔的前面使用該語句宣告,但是還是出錯,而且是在編譯階段就報錯。
[cpp]view plain
copy
error c2732: 鏈結規範與「deletestack」的早期規範衝突。
為什麼會出現這個錯誤呢?因為c++原始檔已經引入了c的標頭檔案,在標頭檔案裡,宣告該函式時沒有extern修飾,而這裡有extern修飾,所以衝突了。解決的辦法有兩個。
一。在c標頭檔案中加上extern修飾符。
直接加,也不行。因為c原始檔也包含了這個標頭檔案,當編譯c原始檔時,就會出現錯誤。所以,需要一種機制來區分是編譯c還是c++檔案。方法如下:
[cpp]view plain
copy
#ifdef __cplusplus
extern
"c"#endif
void
deletestack(stack stack);
因為在編譯c++檔案時,自動定義預處理器名字__cplusplus,而編譯c時,沒有該處理器名字。所以只有編譯c++時,才有符號extern 「c」。
此外,鏈結指示extern "c"有單個和復合兩種形式。以上為單個形式,復合形式可以同時將幾個函式宣告為extern "c"
[cpp]view plain
copy
extern
"c"
加上預處理器名字如下:
[cpp]view plain
copy
#ifdef __cplusplus
extern
"c"
#endif
二。編寫乙個c++風格的標頭檔案,在這裡新增extern修飾符。
使用方法一,很簡單。但是如果該標頭檔案是別人寫好,你無法修改。這個時候就要使用其它方法了。方法是定義c++自己的標頭檔案,檔名為"cstack.h"
[cpp]view plain
copy
// cstack.h
extern
"c"
C 呼叫C函式
我新建了個mfc工程,包含了md5的c檔案,並且按照 cdecl編譯成c 但是我在工程主對話方塊的.cpp檔案呼叫時總出現如下錯誤,用c的時候是沒有的 error c2660 md5init 函式不接受 1 個引數 error c2660 md5update 函式不接受 3 個引數 error c2...
c 呼叫函式
建立c 函式時,會定義函式做什麼,然後通過呼叫函式來完成已定義的任務 當程式呼叫函式時,程式控制權會轉移給被呼叫的函式,被呼叫的函式執行已定義的任務,當函式的返回語句被執行時,或到達函式的結束括號時,會把程式控制權還給主程式 呼叫函式時,傳遞所需引數,如果函式返回乙個值,則可以儲存返回值 例如 in...
c 呼叫函式
main就是乙個函式,它是c 程式的主函式。乙個c 程式可以由乙個主函式和若干子函式組成。主函式是程式執行的開始點。由主函式呼叫子函式,子函式還可以再呼叫其它子函式。呼叫其它函式的函式稱為主調函式。被其他函式呼叫的函式稱為被調函式。乙個函式很可能既呼叫別的函式又被其它函式呼叫。函式呼叫的形式 型別說...