您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-06 21:42 302 查看


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


一、简述

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

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

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


二、使用方法

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

[cpp] view
plain copy

//单语句链接指示  

extern "C" size_t strlen(const char*);  

extern "C" {                         //复合语句链接指示  

  int strcmp(const char*,const char*);  

  char* strcat(char*,const char*);  

}  

链接指示是在关键字extern 后跟一个字符串字面常量,然后再是一般的函数声明,字符串字面常量指出编写函数用的语言。类似的就比如 extern "Ada"  , extern "FORTRAN"等

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

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

[cpp] view
plain copy

//复合语句链接指示  

extern "C"{  

#include<string.h>  //操作C风格字符串的C函数  

}  

当一个#include指示被置于复合链接指示的花括号中时,头文件中的所有普通函数声明都被认为是由链接指示的语言所编写的。链接指示可以嵌套,所以如果头文件中包含了链接指示函数也没关系。

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

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

[cpp] view
plain copy

extern "C" void (*pf) (int); //当我们使用pf调用函数时,编译器认为当前调用的是C函数  

需要注意的是指向C的函数指针和指向C++函数的指针类型不是一样的。因为不能相互赋值,就像类型不匹配一样,比如:

[cpp] view
plain copy

void (*pf1) (int);   //指向C++函数  

extern "C" void (*pf2)(int);  //指向C函数  

pf1=pf2;  //错误,二者类型不一致  

3.链接指示的有效性

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

[cpp] view
plain copy

extern "C" void f1(void(*)(int));  

这里的f1是一个C函数,它得形参也是一个指向C函数的指针,即extern ”C“对整条语句的一切都发生威力,当我们调用f1时必须传给它一个相应C函数的名字或指向C函数的指针。

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


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


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

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

[cpp] view
plain copy

extern "C" double calc(double dparm){/*...*/}  

这样,该函数将为这个函数生成指定语言的代码。当然这种方式会受语言的限制,你懂得。


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


四、重载函数与链接指示

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

转载自:http://blog.csdn.net/u012333003/article/details/21298573
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 链接指示 extern C