如何在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 即可查看结果