zoukankan      html  css  js  c++  java
  • c++ --> extern "C" {}详解

    extern "C" {}详解

      extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。

    C++的编译和连接

      C++是一个面向对象语言,它支持函数的重载,为了支持函数重载的这个特性,C++编译器实际上将下面这些重载函数:

    void print(int i);
    void print(char c);
    void print(float f);
    void print(char* s);

    编译为:

    _print_int
    _print_char
    _print_float
    _pirnt_string

      重载被认为不是多态,多态是运行时动态绑定(“一种接口多种实现”),如果硬要认为重载是多态,它顶多是编译时“多态”。C++中的变量,编译也类似,如全局变量可能编译g_xx,类变量编译为c_xx等。连接是也是按照这种机制去查找相应的变量。

    C的编译和连接

      C语言中并没有重载和类这些特性,故并不像C++那样print(int i),会被编译为_print_int,而是直接编译为_print等。因此如果直接在C++中调用C的函数会失败,因为连接是调用C中的 print(3)时,它会去找_print_int(3)。因此extern "C"的作用就体现出来了。

    C++中调用C的代码

      假设一个C的头文件cHeader.h中包含一个函数print(int i),为了在C++中能够调用它,必须要加上extern关键字。代码如下:

    #ifndef C_HEADER
    #define C_HEADER
     
    extern void print(int i);
     
    #endif C_HEADER

    相对应的实现文件为cHeader.c的代码为:

    #include <stdio.h>
    #include "cHeader.h"
    void print(int i)
    {
        printf("cHeader %d
    ",i);
    }

    现在C++的代码文件C++.cpp中引用C中的print(int i)函数:

    extern "C"{
    #include "cHeader.h"
    }
     
    int main(int argc,char** argv)
    {
        print(3);    //cHeader 3
        return 0;
    }

     

    C中调用C++的代码

      现在换成在C中调用C++的代码,这与在C++中调用C的代码有所不同。如下在cppHeader.h头文件中定义了下面的代码:

    #ifndef CPP_HEADER
    #define CPP_HEADER
     
    extern "C" void print(int i);
     
    #endif CPP_HEADER

    相应的实现文件cppHeader.cpp文件中代码如下:

    #include "cppHeader.h"
     
    #include <iostream>
    using namespace std;
    void print(int i)
    {
        cout<<"cppHeader "<<i<<endl;
    }

    在C的代码文件c.c中调用print函数:

    extern void print(int i);
    int main(int argc,char** argv)
    {
        print(3);
        return 0;
    }


    参考:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html

  • 相关阅读:
    python基础:映射和集合类型
    python基础:列表生成式和生成器
    python基础:名称空间与作用域
    http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html
    2016新年总结
    send()和recv()函数详解
    python基础:测量python代码的运行时间
    python函数与方法装饰器
    Python基础:11.2_函数调用
    MySQL学习笔记-数据库后台线程
  • 原文地址:https://www.cnblogs.com/jeakeven/p/5066281.html
Copyright © 2011-2022 走看看