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

  • 相关阅读:
    模拟算法(八)
    迭代算法(七)
    试探法是一种委婉的做法(六)
    贪心算法并不贪婪(五)
    各个击破的分治算法(四)
    充分利用自己的递归算法(三)
    一起学Spring之Web基础篇
    C# 利用AForge进行摄像头信息采集
    一起学Spring之注解和Schema方式实现AOP
    一起学Spring之AOP
  • 原文地址:https://www.cnblogs.com/yaozhaoyz/p/2755817.html
Copyright © 2011-2022 走看看