C++ 链接指示器:extern ”C"

C++ 链接指示器:extern ”C"


一、简述

  好久就看到过extern “C"这个怪怪的符号了,于是拿来研究一下,果然还是很有料,百度有次面试就有问道。

  编写C++程序有时需要调用其他语言编写的函数,比如C,Ada,FORTRAN等。这种混合编程编写的函数在C++中必须使用链接指示标注,指明函数所使用的语言。extern "C"就是其中一个。

-----------------------------------------------------------------------------

二、使用方法

  1.链接指示有单个核复合两种形式,且不能出现在类定义的内部,也不能出现在函数定义的内部。它必须在函数的声明处出现。比如cstring头文件中的某些C函数声明:

[cpp]  view plain  copy
  1. //单语句链接指示  
  2. extern "C" size_t strlen(const char*);  
  3. extern "C" {                         //复合语句链接指示  
  4.   int strcmp(const char*,const char*);  
  5.   char* strcat(char*,const char*);  
  6. }  
链接指示是在关键字extern 后跟一个字符串字面常量,然后再是一般的函数声明,字符串字面常量指出编写函数用的语言。类似的就比如 extern "Ada"  , extern "FORTRAN"等


链接指示后跟花括号则是将若干个函数括一起来,一次性说明这是非C++函数,其余并不区别。

这种花括号的声明方式还可以用于整个头文件,比如C++中的cstring头文件可以这样:

[cpp]  view plain  copy
  1. //复合语句链接指示  
  2. extern "C"{  
  3. #include<string.h>  //操作C风格字符串的C函数  
  4. }  
当一个#include指示被置于复合链接指示的花括号中时,头文件中的所有普通函数声明都被认为是由链接指示的语言所编写的。链接指示可以嵌套,所以如果头文件中包含了链接指示函数也没关系。

2.指向extern "C"函数的指针

现在编写函数所使用的语言是函数类型的一部分。这样对于使用链接指示的函数来说,它的传递进来的函数指针参数对应的函数也必须与函数本身使用相同的链接指示。

[cpp]  view plain  copy
  1. extern "C" void (*pf) (int); //当我们使用pf调用函数时,编译器认为当前调用的是C函数  
需要注意的是指向C的函数指针和指向C++函数的指针类型不是一样的。因为不能相互赋值,就像类型不匹配一样,比如:

[cpp]  view plain  copy
  1. void (*pf1) (int);   //指向C++函数  
  2. extern "C" void (*pf2)(int);  //指向C函数  
  3. pf1=pf2;  //错误,二者类型不一致  

3.链接指示的有效性

在使用链接指示时,它是包括函数、返回类型和形参类型都有效。比如:

[cpp]  view plain  copy
  1. extern "C" void f1(void(*)(int));  
这里的f1是一个C函数,它得形参也是一个指向C函数的指针,即extern ”C“对整条语句的一切都发生威力,当我们调用f1时必须传给它一个相应C函数的名字或指向C函数的指针。

  因为链接指示同时作用于声明语句中的所有函数,所以如果希望给C++函数传入指向C函数的指针时,得借助类型别名。

-----------------------------------------------------------------------------

三、导出C++函数到其他语言

  上面我们将的是如何在C++中嵌入其他语言编写的函数。现在我们来看如何使一个C++编写的函数能够被其他语言编写的代码段调用。这里可以通过使用链接指示去对函数进行定义。比如:

[cpp]  view plain  copy
  1. extern "C" double calc(double dparm){/*...*/}  
这样,该函数将为这个函数生成指定语言的代码。当然这种方式会受语言的限制,你懂得。

-----------------------------------------------------------------------------

四、重载函数与链接指示

  链接指示与重载依赖于目标语言,目标语言支持则支持,C不支持重载,所以不能extern  "C"用于相同函数名类型。如果在一组重载函数中有一个是C函数,其余的必然都是C++函数。


转载自:http://blog.csdn.net/u012333003/article/details/21298573

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值