链接指示符:extern
如果希望调用其他程序设计语言(尤其是C)写的函数,那么,调用函数时必须告诉编译器使用不同的要求.例如,当这样的函数被调用时,函数名或参数排列的顺序可能不同,无论是C++函数调用它,还是用其他语言写的函数调用它.程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的.
链接指示符有两种形式:
复合语句(compound statement)形式
链接指示符不能出现在函数体中.
vi externC.cpp
-------------------------------------
#include <iostream>
extern "C" double sqrt(double);
int main()
{
using std::cout;
using std::endl;
double result = sqrt(25);
cout << "result = " << result << endl;
return 0;
}
g++ externC.cpp
如果我们希望C++函数能够为C程序所用,我们也可以使用extern "C"链接指示符来使C++函数为C程序可用.
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C链接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
cppExample.h
-----------------------------------
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
//被extern "C"限定的函数或变量首先是extern类型的;extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
//被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;
//extern int add(int x, int y);
#endif
cppExample.cpp
-----------------------------------
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
cFile.c
-----------------------------------
#include <stdio.h>
//这样会编译出错
//#include "cppExample.h"
extern int add(int x, int y);
int main(int argc, char* argv[])
{
printf("%d/n", add(2, 3));
return 0;
}
-----------------------------------
gcc cFile.c cppExample.cpp