简述一下extern C的小作用
大家在C語言的項(xiàng)目中經(jīng)常見到這樣的語句:
#ifdef __cplusplus extern "C" { #endif/*...*/#ifdef __cplusplus } #endif它的作用主要有一下的幾點(diǎn):
**
1、#ifdef _cplusplus/#endif _cplusplus及發(fā)散
2、extern “C”
2.1、extern關(guān)鍵字
2.2、”C”
2.3、小結(jié)extern “C”
3、C和C++互相調(diào)用
3.1、C++的編譯和連接
3.2、C的編譯和連接
3.3、C++中調(diào)用C的代碼
3.4、C中調(diào)用C++的代碼
4、C和C++混合調(diào)用特別之處函數(shù)指針
**
在這里為什么需要#ifdef _cplusplus/#endif _cplusplus呢?因?yàn)镃語言中不支持extern “C”聲明,如果你明白extern “C”的作用就知道在C中也沒有必要這樣做,這就是條件編譯的作用!在.c文件中包含了extern “C”時(shí)會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
extern “C”可以由兩個(gè)方面來解讀,extern 和 “C”
extern關(guān)鍵字
在一個(gè)源文件中引用其他源文件中的變量以及函數(shù)的時(shí)候使用extern 關(guān)鍵字進(jìn)行聲明;
一個(gè)變量可以聲明多次但是只能定義一次
與extern對(duì)應(yīng)的關(guān)鍵字是static,被它修飾的全局變量和函數(shù)只能在本模塊中使用,因此,因此當(dāng)一個(gè)函數(shù)或者變量只能被本模塊使用的時(shí)候,其是不可能被extern “C”修飾的。
extern “C”指令僅指定編譯和鏈接規(guī)約,并不影響語義,指定了extern “C”任然要遵循C++類型檢測(cè)、參數(shù)的轉(zhuǎn)換規(guī)則。
添加上”C”他不會(huì)改變語義但是會(huì)改變它的編譯和鏈接方式,當(dāng)你有很多的語句要加上 extern “C”的時(shí)候可以將它們放到extern “C”{ }之中
小結(jié):extern “C”通過以上的說明我們知道 extern “C”真是目的是為了實(shí)現(xiàn)C和C++的混合編程,在C++源文件中的語句前面加上extern “C”,表明它按照類C的編譯和連接規(guī)約來編譯和連接,而不是C++的編譯的連接規(guī)約。這樣在類C的代碼中就可以調(diào)用C++的函數(shù)or變量等
如何在C++中調(diào)用C代碼
extren “C”是為了實(shí)現(xiàn)C和C++的混合編程,下面就說一下如何在C++調(diào)用C代碼和如何在C中調(diào)用C++代碼;
C++是一個(gè)面向?qū)ο笳Z言(雖不是純粹的面向?qū)ο笳Z言),它支持函數(shù)的重載,重載這個(gè)特性給我們帶來了很大的便利。為了支持函數(shù)重載的這個(gè)特性,C++編譯器實(shí)際上將下面這些重載函數(shù):
void print(int i);
void print(char c);
void print(float f);
void print(char* s);
編譯為:
_print_int
_print_char
_print_float
_pirnt_string
這樣的函數(shù)名,來唯一標(biāo)識(shí)每個(gè)函數(shù)。注:不同的編譯器實(shí)現(xiàn)可能不一樣,但是都是利用這種機(jī)制。所以當(dāng)連接是調(diào)用print(3)時(shí),它會(huì)去查找_print_int(3)這樣的函數(shù)。下面說個(gè)題外話,正是因?yàn)檫@點(diǎn),重載被認(rèn)為不是多態(tài),多態(tài)是運(yùn)行時(shí)動(dòng)態(tài)綁定(“一種接口多種實(shí)現(xiàn)”),如果硬要認(rèn)為重載是多態(tài),它頂多是編譯時(shí)“多態(tài)”
在C++中調(diào)用C代碼很簡(jiǎn)單只需在C代碼的地方加上extern “C”就行了。
重點(diǎn)說一下在C中調(diào)用C++的代碼如何使用extern實(shí)現(xiàn):
現(xiàn)在換成在C中調(diào)用C++的代碼,這與在C++中調(diào)用C的代碼有所不同。如下在cppHeader.h頭文件中定義了下面的代碼:
相應(yīng)的實(shí)現(xiàn)文件cppHeader.cpp文件中代碼如下:
#include "cppHeader.h"#include <iostream> using namespace std; void print(int i) {cout<<"cppHeader "<<i<<endl; }在C的代碼文件c.c中調(diào)用print函數(shù):
extern void print(int i); int main(int argc,char** argv) {print(3);return 0; }注意在C的代碼文件中直接#include “cppHeader.h”頭文件,編譯出錯(cuò)。而且如果不加extern int print(int i)編譯也會(huì)出錯(cuò)。
也就是說在C中引用C++的代碼要在頭文件中進(jìn)行extern “C”的聲明還不能在.c的原文件中直接調(diào)用只能在相應(yīng)的使用函數(shù)的地方使用外部的聲明將函數(shù)引用過來。
C和C++混合編程的特別之處函數(shù)指針的使用
當(dāng)使用C和C++的混合編程的時(shí)候通常會(huì)遇到使用一種語言定義的函數(shù)指針要調(diào)用另一種語言聲定義的函數(shù);
typedef int (*FT) (const void* ,const void*);//style of C++extern "C"{typedef int (*CFT) (const void*,const void*);//style of Cvoid qsort(void* p,size_t n,size_t sz,CFT cmp);//style of C }void isort(void* p,size_t n,size_t sz,FT cmp);//style of C++ void xsort(void* p,size_t n,size_t sz,CFT cmp);//style of C//style of C extern "C" void ysort(void* p,size_t n,size_t sz,FT cmp);int compare(const void*,const void*);//style of C++ extern "C" ccomp(const void*,const void*);//style of Cvoid f(char* v,int sz) {//error,as qsort is style of C//but compare is style of C++qsort(v,sz,1,&compare);qsort(v,sz,1,&ccomp);//okisort(v,sz,1,&compare);//ok//error,as isort is style of C++//but ccomp is style of Cisort(v,sz,1,&ccopm); }總結(jié)
以上是生活随笔為你收集整理的简述一下extern C的小作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级C语言教程-中断和设备驱动
- 下一篇: 作者:王倩(1983-),女,上海计算机