aaa
潘洋的博客

链接指示符extern “C"

     如果程序员希望调用其他程序设计语言(尤其是C)写的函数,那么。调用函数时必须

告诉编译器使用不同的要求。例如,当这样的函数被调用时,函数名或参数排列的顺序可能不同,无论是C++函数调用它,还是用其他语言写的函数调用它。

     程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的。链接指示符有两种形式。既可以是单一句(single statement)形式,也可以是复合语句(compound statenment)形式:

//单一语句形式的链接指示符
extern "C" void exit(int);
//复合语句形式的链接指示符
extern "C" 
{
     int printf( const char*...);
     int scanf( const char*...);
}
//复合语句形式的链接指示符
extern "C"
{
#include <cmath>
}

   链接指示符的第一种形式呦关键字extern后跟一个字符串常量以及一个“普通”的函数生命构成。虽然函数是用另一种语言编写的,但调用它任然需要类型检查。例如,编辑器会检查传递给函数exit()的参数的类型是否是int,或者能够隐形式地转换成int型。

    多个函数声明可以用花括号包含在链接指示符复合语句中,这是链接指示符的第二种形式。花招号被用作分隔符,表示链接指示符应用在哪些声明上。在其他意义上该花括号被忽略,所以在花括号中声明的函数名对外是可见的,就好像函数是在复合语句外声明的一样。例如,在前面的例子中,复合语句extern"C"表示函数printf()和scanf()是在C语言中写的函数。因此,这个声明的意义就如同printf()和extern"C"复合语句外面生命的一样。

     当复合语句链接指示符的括号中含有#include时,在头文件中的函数生命都是被假定是用链接指示符的程序设计语言所写的。在前面的例子中,在头文件<cmath>中声明的函数都是C函数。

    链接指示符不能出现在函数体中。下列代码将会导致编译错误:

int main()
{
//错误:链接指示符不能出现在函数内
extern"C " double sqrt(double);
double getValue();//OK
double result = sqrt( getValue() );
//.....
return 0;
}

estern"C " double sqrt( double );
int main()
{
   double getValue();
   double result = sqrt ( getValue() );
   return 0;

}

但是,把链接指示符放在头文件中更合适。在那里,函数声明描述了函数的接口所

链接指示符来使C++函数为C程序可用。例如:

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

如果一个函数在同一个文件中被声明 一次,则链接指示符可以出现在每个声明中也可以出现在函数的第一次声明中,也可以只出现在函数的第一次声明中,在这种情况下,第二个及以后的声明都接受第一声明中链接指示符 指定的链接规则。例如: 

extern "C" double calc( double);
#include "myMath.h"
double calc( double dparm)
{
}

   在本节中,我们只看到为C语言提供的链接指示:extern"C".extern"C"是唯一被保证由所有C++实现都支持的。每个编译器事先都可以为其环境下常用的语言提供其他指示。例如extern"Ada"可以用来声明是用Ada语言写的函数,extern"FORTRAN"用来 声明是用FORTRAN语言写的函数,等等。因为其他的链接指示随着具体实现的不同而所以建议读者查看编译器的用户指南,以获得其他链接指示符的进一步信息。

  

posted @ 2011-02-10 20:10  SAM洋  Views(457)  Comments(2)    收藏  举报