我們經常會在C/C++程序中見到extern "C",這是一個很重要的概念。本文就來以實例形式講述C/C++中extern "C"的作用。分享給大家供大家參考之用。具體分析如下:
作用:實現C和C++混合編程。
原理:C和C++編譯器編譯之后,函數名會編譯成不同的名字,鏈接階段名字查找會找不到目標,后面實例中會詳解。
用法:
①.c文件中定義的函數,.cpp文件要調用時,該.cpp文件中要用extern "C"聲明該函數;
②.反過來,.cpp文件中定義的函數,.c文件要調用,則同樣要在.cpp文件中用extern "C"聲明,.c文件只用普通的extern聲明。
兩個源文件分別編譯成.o文件,再鏈接成執行文件。鏈接.o文件生成執行文件時,必須得用g++。
實例:
在源文件中聲明的,沒有頭文件
.c文件定義的函數,.cpp文件調用:
//.c文件定義的函數extern int myadd(int a, int b);int myadd(int a, int b){ return a+b;}
//.cpp文件調用#include <iostream>using namespace std;extern "C" int myadd(int a, int b);int main(){ cout << myadd(3, 7) << endl; return 0;}
.cpp文件定義的函數,.c文件調用:
//.cpp文件定義的函數extern "C" int myadd(int a, int b);int myadd(int a, int b){ return a + b;}
//.c文件調用#include <stdio.h>extern int myadd(int a, int b);int main(){ printf("%d/n", myadd(3, 7)); return 0;}
如果在頭文件中聲明,則.c文件正常的包含該頭文件,.cpp文件應該用
//.cpp文件的包含方式extern "C"{ #include "myHead.h"}
的方式來包含頭文件,該頭文件中聲明的函數都為C方式編譯。
原理補充:C文件中,上述函數編譯之后的函數名為類似于_myadd的形式,而CPP的編譯之后函數名為類似于_myadd_int_int的形式,因為CPP要支持重載,用這種方式來區別重載的函數。
相信本文所述對大家的C++程序設計有一定的借鑒價值。
新聞熱點
疑難解答
圖片精選