c++调用c和c调用c++

如何在c++中调用c和在c中调用c++

如何在c++中调用c

c++的设计是兼容c的,但是调用的时候还是需要遵循规则

1 包含头文件

extern "C"{
    #include "c_func.h"
}

2 声明调用的函数
extern “C”{
int add(int x ,int y);
}

为什么要加extern “C”?

1 C++语言支持函数重载,C语言不支持函数重载。
2 函数被C++编译后在库中的名字与C语言的不同。
    void add(int x, int y);

    该函数被C 编译器编译后在库中的名字为_ add,而C++编译器则会产生像
    _add_int_int之类的名字用来支持函数重载和类型安全连接。

为什么extern “C”有效呢

C++编译器已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件

其实可以做下代码优化

具体代码

//
//  main.cpp
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include <iostream>
using namespace std;


extern "C"{
#include "c_func.h"
}

extern "C"{
    int add(int x ,int y);
}

/*
int add(int x,int y){
    return x+y;
}
*/

double add(double x,double y){
    return x+y;
}

//重载
int max(int a,int b)
{
    return a>=b?a:b;
}

double max(double a,double b)
{
    return a>=b?a:b;
}


int main(int argc, const char * argv[]) {
    cout << "c++ call c function\n";
    cout << add(11,11) << endl;
    cout << add(11.1,11.1) << endl;

    cout<<"max int is: "<<max(1,3)<<endl;
    cout<<"max double is: "<<max(1.2,1.3)<<endl;
    return 0;
}

//
//  c_func.h
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#ifndef __cpp_call_c__c_func__
#define __cpp_call_c__c_func__

#include <stdio.h>

int add(int x ,int y);

#endif /* defined(__cpp_call_c__c_func__) */



//
//  c_func.c
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include "c_func.h"

int add(int x ,int y){
    return x+y;
}

咱们改进下代码,一般的c项目都会这么干

//
//  main.cpp
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#ifndef __cplusplus
#define __cplusplus 1
#endif

#include <iostream>

using namespace std;


/*
extern "C"{
#include "c_func.h"
}

extern "C"{
    int add(int x ,int y);
}
*/

/*
int add(int x,int y){
    return x+y;
}
*/

double add(double x,double y){
    return x+y;
}

//重载
int max(int a,int b)
{
    return a>=b?a:b;
}

double max(double a,double b)
{
    return a>=b?a:b;
}


int main(int argc, const char * argv[]) {
    cout << __cplusplus;
    cout << "c++ call c function\n";
    cout << add(11,11) << endl;
    cout << add(11.1,11.1) << endl;

    cout<<"max int is: "<<max(1,3)<<endl;
    cout<<"max double is: "<<max(1.2,1.3)<<endl;
    return 0;
}


//
//  c_func.h
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#ifndef __cpp_call_c__c_func__
#define __cpp_call_c__c_func__


#ifdef __cplusplus
extern "C" {
#endif
int add(int x ,int y);

#ifdef __cplusplus
}
#endif

#endif /* defined(__cpp_call_c__c_func__) */

//
//  c_func.c
//  cpp_call_c
//
//  Created by bikang on 16/9/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#ifdef __cplusplus
extern "C" {
#endif

#include "c_func.h"

int add(int x ,int y){
    return x+y;
}

#ifdef __cplusplus
}
#endif

代码结束,咱们再聊聊c中调用c++

如何在c中调用c++

c中调用c++的难点:

C与C++的区别主要是C不支持类(Class),不支持函数重载(function overloading),当然模板(template)也是不支持的。所以要在C程序中调用C++代码,最重要的原则就是给C程序提供一个C程序可用的接口。

所以c中调用cpp的时候需要做个可供c使用的接口

总结下有如下四点需要注意的

规则一:接口中不能涉及类,以及引用
规则二:接口中不能有重名函数
规则三:接口需要用 extern "C"来声明
规则四:用 #ifdef __cplusplus 来避免编译失败

下面的例子总结起来有如下步骤希望能对你有帮助

1 写好你的cpp代码

2 把你的cpp代码打包成库

3 把cpp库在封装成c允许的函数

4 把函数打包成库

5 用c调用cpp

来个例子(本例子是在linux环境下测试的):
下了解一个参数 -fPIC –shared

    -fPIC则表明使用地址无关代码。PIC:Position Independent Code Linux下编译共享库时,必须加上-fPIC参数,否则在链接时会有错误提示
    --shared 动态共享库
gcc会自动调用/lib/或者/usr/lib/下的库

ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.   如果出错  ldconfig下试试

//hi.cpp

  #include <iostream>
    void hi(){
        std::cout << "hi cpp";
    }
运行 g++ -fpic -shared -o libtesthi.so hi.cpp 
然后 cp libtesthi.so /lib/

//interface.cpp

    #include <iostream>

    void hi();

    #ifdef __cplusplus
    extern "C"{ 
    #endif
      void cpp_hi();
      void cpp_hi()
      {
        hi();
      }

    #ifdef __cplusplus
    }
    #endif

运行 g++ -fpic -shared -o libtestinterface.so interface.cpp -ltesthi
然后 cp libtestinterface.so /lib/
接着 ldconfig下
//t.c代码
    #include <stdio.h>

    int main()
    {
      cpp_hi();

      return 0;
    }
//运行 gcc t.c -ltestinterface -o t
//运行 ./t 即可查看结果

c中调用c++参考博客1
c中调用c++参考博客2
c中调用c++参考博客3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值