標籤:style blog color os io strong 檔案 div log
作用:實現C和C++混合編程。
原理:C和C++編譯器編譯之後,函數名會編譯成不同的名字,連結階段名字尋找會找不到目標,後面執行個體中會詳解。
用法:①.c檔案中定義的函數,.cpp檔案要調用時,該.cpp檔案中要用extern "C"聲明該函數;②反過來,.cpp檔案中定義的函數,.c檔案要調用,則同樣要在.cpp檔案中用extern "C"聲明,.c檔案只用普通的extern聲明。
兩個源檔案分別編譯成.o檔案,再連結成執行檔案。連結.o檔案產生執行檔案時,必須得用g++。
執行個體:
在源檔案中聲明的,沒有頭檔案
.c檔案定義的函數,.cpp檔案調用:
1 //.c檔案定義的函數2 extern int myadd(int a, int b);3 4 int myadd(int a, int b)5 {6 return a+b;7 }
1 //.cpp檔案調用 2 #include <iostream> 3 using namespace std; 4 5 extern "C" int myadd(int a, int b); 6 7 int main() 8 { 9 cout << myadd(3, 7) << endl;10 return 0;11 }
.cpp檔案定義的函數,.c檔案調用:
1 //.cpp檔案定義的函數2 extern "C" int myadd(int a, int b);3 4 int myadd(int a, int b)5 {6 return a + b;7 }
1 //.c檔案調用 2 #include <stdio.h> 3 4 extern int myadd(int a, int b); 5 6 int main() 7 { 8 printf("%d\n", myadd(3, 7)); 9 return 0;10 }
如果在標頭檔中聲明,則.c檔案正常的包含該標頭檔,.cpp檔案應該用
1 //.cpp檔案的包含方式2 extern "C"3 {4 #include "myHead.h"5 }
的方式來包含標頭檔,該標頭檔中聲明的函數都為C方式編譯。
原理補充:C檔案中,上述函數編譯之後的函數名為類似於_myadd的形式,而CPP的編譯之後函數名為類似於_myadd_int_int的形式,因為CPP要支援重載,用這種方式來區別重載的函數。
extern "c" 的作用