C++中如何呼叫C語言的程式碼實現
阿新 • • 發佈:2020-03-11
為什麼要是用 extern "C"
在進行C++開發的時候,由於C、C++編譯規則是不同的。C++編譯函式方法是 使用mangle的技術 。
void func(int age) { } void func(int age,int height) { } /*如果有這兩個函式要被呼叫,在C語言中函式過載是不允許的,那麼在C++中為什麼可以呢。 C++中就是使用了mangle技術,對函式過載的函式名加上編譯器中自定義規則的表示符,編譯之後的函式名就會不一樣。 例如 func(int age) -> func_int(int age) func(int age,int height) -> func_int_int(int age,int height) */
而在C語言中是沒有這個技術的,所以如果我們想要呼叫C語言開發的一些API,就需要使用 extern "C"
修飾C語言的函式宣告。
extern "C" 用法
直接在函式前面加上 extern "C"
關鍵字
extern "C" void fun() { printf("test"); }
如果有函式宣告與函式實現,要讓函式宣告被 extern "C"
修飾,函式實現可以不修飾
extern "C" void func(); void func() { cout << "func()" << endl; }
如果有多個函式要被 extern "C"
extern "C" { void func(); void func1(); } void func() { cout << "func()" << endl; } void func1() { cout << "func1()" << endl; }
自定義C語言函式庫
但是我們每次使用C語言的API都用這個 extern "C"
修飾那是不是太麻煩了,那我們學會了怎麼去使用 extern "C"
,我們可以在編寫C語言API庫的時候,直接使用這個來修飾,那麼C++再去呼叫的時候就不用這麼麻煩了,直接使用這個函式就可以了。
//在sum.h檔案中定義sum函式 extern "C" { int sum(int a,int b); } int sum(int a,int b) { return a + b; } //在main.cpp檔案中包含這個庫檔案之後就可以直接使用了 int main() { cout << sum(1,2) << endl; getchar(); }
但是這麼定義的話就會產生另一個問題,那麼就是無法在C語言檔案中呼叫這個庫
因為在C語言中是沒有 extern "C"
這個關鍵字的。呼叫這個庫,就是直接把這個庫的檔案程式碼拷貝過來。例如:
#include <stdio.h> #include "sum.h" extern "C" { int sum(int a,int b) { return a + b; } void main() { printf("%d",sum(3,4)); }
那麼我們就需要在定義這個sum庫的時候 加上一些約束規則 ,讓他在被C++呼叫的時候加上 extern "C"
關鍵字,在被C語言呼叫的時候去掉這個關鍵字。
//sum.h檔案宣告 #ifndef __SUM_H #define __SUM_H #ifdef __cplusplus extern "C" { #endif int sum(int a,int b); #ifdef __cplusplus } #endif #endif //sum.c檔案實現 #include "sum.h" int sum(int a,int b) { return a + b; }
__cplusplus
這個巨集是C++中 特有的 。它在載入C++檔案的時候 會提前定義這個巨集 ,所以我們只要 判斷檔案中是否有這個巨集 ,有的話就是C++在呼叫,沒有的話就是C語言,這樣就可以很好地解決了這個混合呼叫的問題。
到此這篇關於C++中如何呼叫C語言的程式碼的文章就介紹到這了,更多相關C++呼叫C語言內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!