zoukankan      html  css  js  c++  java
  • extern关键字(2) extern "C"

    C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,

    C语言则不会,直接将会将函数名作为中间函数名称。

    因此C++程序调用C方式编译的函数时, 可能会在链接时找不到对应的函数。

    例子:

    // extern.h

    1 int sum(int a,int b);

    //extern1.c

    1 int sum(int a,int b)
    2 {
    3         return a+b;
    4 }

    //extern2.cpp

    #include <iostream>
    using namespace std;
    extern  int sum(int a,int b);
    int main()
    {
            cout<<sum(3,2)<<endl;
            return 0;
    }

    编译: gcc -c extern1.c       //按照c的方式编译sum函数

    g++ -c extern2.cpp   // 按照c++的方式调用sum函数

    然后: g++ extern2.o extern1.o   //链接成exe

    注: 对于.c后缀名的程序,gcc认为是c程序,g++认为是c++程序; 对于.cpp后缀名的程序,gcc和g++都认为是c++程序。

    结果:

    extern2.o: In function `main':
    extern2.cpp:(.text+0xf): undefined reference to `sum(int, int)'
    collect2: ld returned 1 exit status

    //正确的使用旧文件extern.c中sum函数的方法:extern3.cpp

    1 #include <iostream>
    2 using namespace std;
    3 extern "C" {int sum(int a,int b);}
    4 int main()
    5 {
    6         cout<<sum(3,2)<<endl;
    7         return 0;
    8 }

    链接: g++ extern1.o    extern3.o     正确!

    总结: 当c++程序需要调用之前用C方式编译出来的.a .so, 可以使用 extern "C". 

  • 相关阅读:
    python笔试题(3)
    跨域资源共享 CORS 详解
    RequestDispatcher接口include方法
    清除浮动的四种方式及其原理理解
    css---vw布局来适应移动端【解决rem的bug】
    golang 实现简单的rsa加密算法
    golang 查找素数
    JAVA大文件上传支持分片上传
    JSP大文件上传支持切割上传
    JSP大文件上传支持分场上传
  • 原文地址:https://www.cnblogs.com/yaozhaoyz/p/2755817.html
Copyright © 2011-2022 走看看