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". 

  • 相关阅读:
    机器学习之逻辑回归
    机器学习之线性回归与模型保存
    机器学习之决策树
    机器学习之贝叶斯算法
    机器学习之KNN算法
    算法基础与开发流程
    特征选择与特征降维
    特征预处理
    RSA加密算法和签名算法
    Java中使用OpenSSL生成的RSA公私钥
  • 原文地址:https://www.cnblogs.com/yaozhaoyz/p/2755817.html
Copyright © 2011-2022 走看看