extern

来源:互联网 发布:上海淘宝运营助理招聘 编辑:程序博客网 时间:2024/06/05 14:14

链接指示符:extern

如果希望调用其他程序设计语言(尤其是C)写的函数,那么,调用函数时必须告诉编译器使用不同的要求.例如,当这样的函数被调用时,函数名或参数排列的顺序可能不同,无论是C++函数调用它,还是用其他语言写的函数调用它.
程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的.

链接指示符有两种形式:


单一语句(single statement)形式

复合语句(compound statement)形式


当复合语句链接指示符的括号中包含有#include时,在头文件中的函数声明都被假定是用链接指示符的程序设计语言所写的.
链接指示符不能出现在函数体中.

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 "C" int add(int x, int y);
//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

原创粉丝点击