第18章 特殊工具与技术(14)

来源:岁月联盟 编辑:exp 时间:2012-01-13

18.7.3 链接指示:extern “c”

C++使用链接指示(linkage directive)指出任意非C++函数所用的语言。

1. 声明非C++函数

链接指示有两种形式:单个的或复合的。链接指示不能出现在类定义或函数定义的内部,它必须出现在函数的第一次声明上。

[cpp] #include <cstdlib>  
extern "C" size_t strlen(const char*); 
extern "C" {int strcmp(const char*,const char*); 
char *strcat(char*,const char*);} 
#include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}第一种形式由关键字extern后接字符串字面值,再接“普通”函数声明构成。字符串字面值指出编写函数所用的语言。

通过将几个函数的声明放在跟在链接指示之后的花括号内部,可以给他们设定相同的链接。花括号的作用是将应用链接所示的声明聚合起来,忽略了花括号,花括号中声明的函数名就是可见的,就像在花括号之外声明函数一样。

2. 链接指示与头文件

可以将多重声明形式应用与整个头文件。

[cpp] extern "C"{ 
#include <string.h>  

extern "C"{
#include <string.h>
}允许将C++从C函数库继承而来的函数定义为C函数,担不是必须定义为C函数——决定是用C还是用C++实现C函数库,是每个C++实现的事情。

3. 导出C++函数到其他语言

[cpp] extern "C" double calc(double dparm){ 
    return 0.0; 

extern "C" double calc(double dparm){
 return 0.0;
}通过对函数定义使用链接指示,使得用其他语言编写的程序可以使用C++函数。

用链表指示定义的函数的每个声明都必须使用相同的链接指示。

4. 链接指示支持的语言

要求编译器支持对C语言的链接指示,编译器可以为其他语言提供链接说明。例如,extern "Ada"、extern "FORTRAM"等。

5. 重载函数与链接指示

链接指示与函数重载之间的相互作用依赖于目标语言。如果语言支持重载函数,则为该语言实现链接指示的编译器很可能也支持C++的这些函数的重载。

C++保证支持的唯一语言是C。C语言不支持函数重载,所以,不应该对下面的情况感到惊讶:在一组重载函数中只能为一个C函数指定链接指示。用给定名字的C链接声明多于一个函数是错误的。

在C++程序中,重载C函数很常见,但是,重载集合中的其他函数必须都是C++函数。

6. extern “C”函数的指针

编写函数所用的语言是函数类型的一部分。为了声明用其他程序设计语言编写的函数的指针,必须使用链接指示。

C函数的指针与C++函数的指针具有不同的类型,不能将C函数的指针初始化或赋值为C++函数的指针。


 摘自 xufei96的专栏