搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
你好赵伟
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【ANDROID学习】_emulator: error: x86_64 emulation currently requir
2
【C语言】linux内核ipoib模块 - ipoib_tx_poll
3
欧盟发布关于网络安全、通信网络弹性的综合风险评估报告:具有战略意义的十大网络安全风险场景
4
【py2neo学习笔记】利用py2neo库来操作neo4j 知识图谱的创建、增加、删除、修改、查询、案例、参考博客_neo2py
5
卷积神经网络resent网络实践_linux resnet网络实现
6
进程与线程_进程和线程分配资源的最小单元
7
uniapp调用地图,进行位置查询,标记定位_uniapp
8
windows错误代码详解
9
SSD(single shot multibox detector)算法及Caffe代码详解_ssd算法添加四个卷积的作用
10
Android VSYNC (Choreographer)与UI刷新原理分析_touch choreographer 算法
当前位置:
article
> 正文
C中如何调用C++函数_c调用c++函数
作者:你好赵伟 | 2024-03-06 00:34:19
赞
踩
c调用c++函数
1,在C中如何调用C++函数将函数用extern "C"声明;
将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:
// C++ code:
extern "C" void f(int);
void f(int i)
{
// ...
}
然后,你可以这样使用 f():
/* C code: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}
2, 那么如何将类内成员函数声明?
当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:
// C++ code:
class C
{
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
然后,你就可以这样调用 C::f():
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
例子:
TVqecPayloadFetcher * vqecPayloadFetcher = NULL;
IVqecStatistics::TVqecStatisticsInfo vqecStatisticsInfo ;
bool Ttest::
Myfun
(const char* addr, uint32_t port) throw ()
{
vqec_ifclient_get_dcr_info_ops_t dcr_info_ops;
::vqecPayloadFetcher = this;
memset(&vqecStatisticsInfo, 0, sizeof(vqecStatisticsInfo));
dcr_info_ops.get_dcr_stats = GetDcrStats;
::vqec_ifclient_bind_params_set_dcr_info_ops(bp, &
dcr_info_ops
);
}
TVqecStatisticsCaller * TVqecPayloadFetcher::
GetVqecStatisticsCaller
() throw()
{
return VqecStatisticsCaller;
}
/*
* Callback function supplied during a tuner bind operation.
*/
extern "C" int32_t GetDcrStats (int32_t context_id,
vqec_ifclient_dcr_stats_t *stats)
{
if(vqecPayloadFetcher !=NULL) {
if (vqecPayloadFetcher->GetVqecStatisticsCaller() && vqecStatisticsInfo.DecodedPictureCount == 0) {
vqecPayloadFetcher->GetVqecStatisticsCaller()->GetVqecReport(vqecStatisticsInfo, result);
if (result == ITypes::RESULT_OK) {
if (vqecStatisticsInfo.FirstFrameDisplayTime != 0) {
// Here add your wanted code
stats->dec_picture_cnt = vqecStatisticsInfo.DecodedPictureCount;
stats->fst_decode_time = vqecStatisticsInfo.FirstFrameDecodeTime;
stats->last_decoded_pts = vqecStatisticsInfo.LastDecodedPTS;
stats->display_time = vqecStatisticsInfo.FirstFrameDisplayTime;
stats->display_pts = vqecStatisticsInfo.FirstDisplayedPTS;
fprintf(stderr, "%s:%d:%s, vqec stats info if(temp !=NULL) get the vqec statistics info here. \n",__FILE__, __LINE__,__FUNCTION__ );
} else {
fprintf(stderr, "%s:%d:%s, vqec stats info if(temp !=NULL) not get the vqec statistics info here.\n",__FILE__, __LINE__,__FUNCTION__ );
}
}
}
fprintf(stderr, "%s:%d:%s, vqec stats info else if(temp !=NULL) \n",__FILE__, __LINE__,__FUNCTION__ );
//stats->dec_picture_cnt = 15;
} else{
fprintf(stderr, "%s:%d:%s, vqec stats info else if(temp !=NULL) \n",__FILE__, __LINE__,__FUNCTION__ );
stats->dec_picture_cnt = 18;
}
}
3, 如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:
// C++ code:
void f(int);
void f(double);
extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }
然后,你可以这样使用每个重载的 f():
/* C code: */
void f_i(int);
void f_d(double);
void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。
4, 如何在c程序中调用c++的库
假如我们手上有一个c++的类
//test1.h
class Test
{
public:
void test();
};
//test1.cc
#include "test1.h"
void Test::test();
{
printf("just a test!\n");
}
我们需要用一个C程序来调用这个c++库里面的函数。
A. 将C++库做C的封装。
//test2.c
#include "test1.h"
extern "c"
{
void test()
{
Test t;
t.test();
}
}
编译:g++ -shared -o test.so test2.c test1.cc
B. 编写用C代码调用C++的实现
//test.c
#include <dlfcn.h>
#include <stdio.h>
int main(int argc , char ** argv)
{
void * lib = dlopen("./test.so" , RTLD_LAZY);
if (lib == 0)
{
printf("lib is null\n");
return -1;
}
void (* function)();
function = dlsym(lib , "test");
if (function == 0)
{
printf("function == 0\n");
return -1;
}
function();
dlclose(lib);
return 0;
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/你好赵伟/article/detail/194911?site
推荐阅读
article
Bad
owner
or
permissions
on C:\\Users\\用户名/.
ssh
/co...
https://github.com/PowerShell/Win32-OpenSSH/releases1.下载 Ope...
赞
踩
article
通义千问
1.5
(Qwen
1.5
)大
语言
模型
在
PAI
-
QuickStart
的微调与部署实践...
Qwen
1.5
(通义千问
1.5
)是阿里云最近推出的开源大型
语言
模型
系列。作为“通义千问”1.0系列的进阶版,该
模型
推出了...
赞
踩
article
Jetson
nano安装Google拼音输入法_pkg:
error
processing
arc...
之前在Ubuntu用的中文输入法时搜狗输入法的Linux版本,但是在
Jetson
nano中安装搜狗输入法的时候,也...
赞
踩
article
SpringBoot
项目集成
消息中间件
以后@
JmsListener
注解
不能生效的问题_jmslist...
SpringBoot
项目集成
消息中间件
以后@
JmsListener
注解
不能生效的问题_
jmslistener
无效jmsl...
赞
踩
article
bond
模式
配置_服务器
bond
模式
...
网卡
bond
是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡。在应用部署中是一种常用的技术_服...
赞
踩
article
OBS
源码分析三
RTMP
推流
输出
_
obs
源代码...
1.第一步先看
RTMP
推流
输出
流程图2.第二步
RTMP
输出
代码详细步骤说明首先是RtmpOutput
输出
对象的创建和编码...
赞
踩
article
如何
画
lda
投影
结果
_
FlyAI
小课堂:隐含
狄利克
雷
分布
(
LDA
)(6)...
在开始学习之前推荐大家可以多在
FlyAI
竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。
FlyAI
是为AI开发者提供...
赞
踩
article
本地前端
项目
使用
gitee
仓库
外链
图片
加载失败_
scdn
不能拿到自己
gitee
仓库
的
图片
怎么办
...
要是vue
项目
的话,直接去public下面的index.html中加入meta标签即可。,在请求中会带有referrer...
赞
踩
article
高效
c
/
c
++
日志
工具
zlog
使用
介绍_
c
++
使用
zlog
...
1.
zlog
简介
zlog
的资料网上很多,这里不在详细说明;
zlog
是用
c
写的一个
日志
工具,非常小,而且高效,可以同时向...
赞
踩
article
C调用
C++
代码
...
有时C程序里需要用到
C++
的类,但是C语言又不能直接调用类,这时需要把
C++
的类使用C接口封装后,再调用,可以将封装后的...
赞
踩
article
nginx
配置通过
服务器
ip
直接
访问
文件
_
nginx
代理后的
服务器
,如何
直接
通过ip加
文件
地址
直接
...
location ~ .*.(xls|xlsx|)$ {expires 24h;root D:/
nginx
-1.17.3...
赞
踩
article
【
嵌入式
学习-
Zlog
】
Zlog
日志
框架学习_
zlog
使用
及
文件
配置
...
Zlog
是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C
日志
函数库。它支持
日志
分级、切片、自定义格式等操作。以下是...
赞
踩
article
RTMP
、
RTSP
、
m3u8
、
flv
区别及含义_
m3u8
flv
...
RTMP
、
RTSP
、
m3u8
、
flv
区别及含义_
m3u8
flv
m3u8
flv
...
赞
踩
article
元
学习
(
Meta
-
learning
)...
元
学习
(
Meta
-
learning
)概述1. 定义:传统的机器
学习
研究模式是:获取特定任务的大型数据集,然后用这个数据集...
赞
踩
article
基于
obs
studio
的
源码应用
_
obs
studio
接口...
OBS(Open Broadcaster Software)是一个广泛使用
的
视频录制直播软件。利用该软件可以实现桌面窗口...
赞
踩
article
cloudera
,
cdh
, hive,
impala
,
Kerberos
_
cdh
容灾 容错...
Impala 认证现在可以通过 LDAP 和
Kerberos
联合使用来解决Impala是基于 Apache Hado...
赞
踩
article
朴素
贝叶斯
/
SVM
/
LDA
主题模型_
lda
仿真
算法
测试...
一.
朴素
贝叶斯
在所有的机器学习分类
算法
中,
朴素
贝叶斯
和其他绝大多数的分类
算法
都不同。对于大多数的分类
算法
,比如决策树,...
赞
踩
article
JAVA
中的4种
访问
修饰符
_
java
访问
修饰符
...
快速了解
JAVA
中的4中
访问
修饰符
_
java
访问
修饰符
java
访问
修饰符
&n...
赞
踩
article
ChatGPT
支持下
的
PyTorch
机器
学习
与
深度
学习
技术应用...
本文详细介绍
深度
学习
的
基础知识,与经典
机器
学习
算法
的
区别与联系,以及最新
的
迁移
学习
、循环神经网络、长短时记忆神经网络、时...
赞
踩
article
有没有
一款
好用
的
文字转语音
工具
?_
srt
转语音
在线
...
配音一直是现在火爆
的
话题,不管是短视频还是日常配音,都需要用到软件配音。通俗来说,将文字上传
的
配音
工具
框,实现转换成音频...
赞
踩
相关标签
ssh
运维
语言模型
人工智能
阿里云
嵌入式
Jetson nano
java
SpringBoot
JMSListener
activeMq
注解失效
linux
如何画lda投影结果
前端
gitee
nginx
学习
c语言
嵌入式硬件
ffmpeg
网络
深度学习
机器学习