C和C++实现互调的方法

news2025/1/19 14:37:43

先解释一下C和C++为什么不能直接互相调用:

        C++支持函数重载,所以在编译的时候,函数名会发生变化。C语言不存在这个问题。那么在调用的时候,C++找的是变化后的函数名,而C语言找的是原始的函数名。所以两者不能直接调用。

举个例子:

        如下代码,分别使用C和C++去编译,其库接口会发生变化:

#include <stdio.h>


int cpp_func(void)
{
    printf("Hello from CPP!\n");
    return 0;
}

C++编译生成的符号链接:

C语言编译生成的符号链接:

那么C和C++怎么实现互调了:

把需要互调的函数,使用extern C包起来。这样就可以了。extern C是告诉编译以C的方式去编译、调用。

注:C++的代码经过extern C包起来编译后,被其他C++代码调用时,其他代码需要extern C包一下调用的代码。不然会提示找不到对应的函数。

问题:别人提供给你的是C++未经过extern处理的代码库,你的代码是C代码,请问你怎么去调用。

解决:你自己创建一个cpp文件,调用他的代码库,让后将你的CPP文件使用extern处理。这样你的C代码调用你处理后的接口。

用到的测试相关的代码:

编译脚本:make.sh

#!/bin/bash

gcc test_c.c -o libtest_c.so -shared -fPIC
g++ test_cpp.cpp -o libtest_cpp.so -shared -fPIC
g++ src_cpp.cpp -o libsrc_cpp.so -shared -fPIC

gcc main_c.c -o main_c -L. -ltest_cpp
g++ main_cpp.cpp -o main_cpp -L. -ltest_c -ltest_cpp


LD_LIBRARY_PATH=. ./main_c
LD_LIBRARY_PATH=. ./main_cpp

c代码调用C++:main_c.c

#include <stdio.h>
#include "test_cpp.h"

int main()
{
    printf("%s %s %d:\n", __FILE__, __func__, __LINE__);
    cpp_func();
    return 0;
}

c++代码调用C代码、C++extern代码:main_cpp.cpp

#include <stdio.h>


extern "C"
{
#include "test_c.h"
#include "test_cpp.h"
}

int main()
{
    printf("%s %s %d:\n", __FILE__, __func__, __LINE__);
    c_func();
    cpp_func();
    return 0;
}

C++代码:src_cpp.cpp(用于查看C++不经过extern处理编译出来的符号信息)

#include <stdio.h>


int cpp_func(void)
{
    printf("Hello from CPP!\n");
    return 0;
}

C库代码:test_c.c

#include <stdio.h>


int c_func(void)
{
    printf("Hello from C!\n");
    return 0;
}

C库头文件:test_c.h

#ifndef _TEST_C_H_
#define _TEST_C_H_

int c_func(void);

#endif /*_TEST_C_H_*/

C++库代码:test_cpp.cpp

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

int cpp_func(void)
{
    printf("Hello from CPP!\n");
    return 0;
}


#ifdef __cplusplus
}
#endif

C++库头文件:test_cpp.h

#ifndef _TEST_CPP_H
#define _TEST_CPP_H

int cpp_func(void);

#endif /*_TEST_CPP_H*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析KHD-厨帽检测算法从源码到实际应用的方案

厨帽检测算法&#xff0c;作为计算机视觉技术在食品安全领域的一项重要应用&#xff0c;其实际应用过程涉及多个方面。 厨帽检测算法主要基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;和目标检测框架&#xff08;如YOLO、Faster RCNN等&#xff…

部署webdav工具alist

1、下载部署包&#xff08;根据自己的环境下载对应包&#xff09; #进到指定目录下 cd /usr/local #下载部署包 wget https://github.com/alist-org/alist/releases/download/v3.35.0/alist-linux-arm64.tar.gz #加压包 tar zxf alist-linux-arm64.tar.gz2、进行部署安装 # 授…

海莲花活跃木马KSRAT加密通信分析

1.概述 自2023年8月至今&#xff0c;海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信&#xff0c;每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密&#xff0c;而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”…

Gaussian Splatting 在 Ubuntu22.04 下部署

代码:graphdeco-inria/gaussian-splatting (github) 论文:[2308.04079] 3D Gaussian Splatting for Real-Time Radiance Field Rendering (arxiv.org) 1. 禁用自带驱动 Nouveau Ubuntu 自带的显卡驱动,是非 Nvida 官方版。在后面装 CUDA 的时候,会报驱动不兼容问题。 1.…

浅析海思 3520DNVR源代码和网络硬盘录像机NVR全套源码方案

通过海思3520D实现NVR&#xff08;网络视频录像机&#xff09;芯片方案及硬盘录像机的算法功能&#xff0c;主要依赖于海思3520D芯片的强大性能和丰富的功能特性。 基于海思3520D芯片的NVR芯片方案&#xff0c;主要实现了以下功能&#xff1a; 视频接入与存储&#xff1a; 支…

Ultrascale/+的SYSMON获取温度值

XADC与SYSMON SYSMON结构框图 参考电压 有两种形式提供参考电压&#xff1a;外部供电和内部供电。 源语结构 温度计算 SYSMONE1 使用内部参考电压的话&#xff0c;计算公式如下&#xff1a; 通过ADC Code来计算温度的公式&#xff1a; 通过温度来计算ADC Code的公式&#x…

微信支付-h5、jsapi、native

1、微信支付-h5&#xff1a;适用于非微信客户端的浏览器微信支付&#xff1b; 2、微信支付-jsapi&#xff1a;适用于微信客户端的浏览器微信支付&#xff1b; 3、微信支付-native&#xff1a;适用于web端扫码支付。 服务商模式&#xff0c;相关配置如下&#xff1a; 1&…

设计模式(3)结构型模式

结构型模式 结构型模式1. Adapter&#xff08;适配器模式&#xff09;2. Bridge&#xff08;桥接模式&#xff09;3.Composite&#xff08;组合模式&#xff09;4.Decorator&#xff08;装饰模式&#xff09;5.Facade&#xff08;外观模式&#xff09;6.Flyweight&#xff08;享…

【html+css 绚丽Loading】 - 000010 三才定星轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

定制开发AI智能名片商城小程序:融合销售策略与个人魅力的营销新路径

摘要&#xff1a;在数字化时代&#xff0c;营销策略的创新与个性化成为企业脱颖而出的关键。本文探讨了如何通过定制开发AI智能名片商城小程序&#xff0c;结合销售策略与个人魅力&#xff0c;实现用户心甘情愿购买产品的目标。通过分析用户行为、心理需求及市场趋势&#xff0…

东方博宜OJ 训练计划:数学知识及编程应用 习题集

啊啊啊&#xff0c;好久没发过题解啦&#xff0c;望各位大佬 RP 食用OJ : 东方博宜 网站&#xff1a;东方博宜 第一部分&#xff1a;素数 这里想必大家都很了解了&#xff0c;就不详细介绍了 &#xff08;实在太累了&#xff09; 在C中&#xff0c;素数是一个只能被1和自身整…

Chrome浏览器 本地js代码替换(Overrides)以及多场景出现 浏览器响应慢、卡顿等情况——问题解决

前言&#xff1a;作为一名前端开发者&#xff0c;chorme 的本地代码替换功能可以说非常收益的。例如&#xff1a;某一前端的线上版本出现问题了&#xff0c;如果不想跑本地代码调试&#xff0c;只是想先通过Chrome线上改代码的方式来定位问题并尝试修复可以说是非常方便。但是&…

2024 Testing Expo即将开幕,怿星科技展品大剧透!

汽车行业万众瞩目的 汽车测试及质量监控博览会&#xff08;Testing Expo China – Automotive&#xff09; 即将在上海开幕&#xff01; 2024年8月28日至30日 上海世博展览馆H1馆 怿星科技诚邀您莅临展位&#xff08;展位号2057&#xff09;&#xff01; 怿星科技将展出哪…

二叉树中的奇偶树问题

目录 一题目&#xff1a; 二思路汇总&#xff1a; 1.二叉树层序遍历&#xff1a; 1.1题目介绍&#xff1a; 1.2 解答代码&#xff08;c版&#xff09;&#xff1a; 1.3 解答代码&#xff08;c版&#xff09;&#xff1a; 1.4 小结一下&#xff1a; 2.奇偶树分析&#xf…

【学习笔记】Matlab和python双语言的学习(一元线性回归模型)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab1.Matlab 的 regress 函数2.Matlab 代码 四、代码实现----…

我像只鱼儿在你的进程池~

我像只鱼儿在你的进程池&#xff5e; 只为你守候这进程间通信&#xff5e; 一点都不押韵 点踩吧 父进程是master&#xff0c;它提前创建出一堆紫禁城&#xff0c;如果有命令就交给子进程去执行&#xff08;和shell不一样&#xff0c;shell是有任务才去创建子进程&#xff09…

吹爆SyntaxFlow!数据流分析实战解析

正文开始前辟个谣先 最近有小伙伴来问闭源收费的事 牛牛郑重告知大家 目前还没有这个计划 请大家放心使用 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 样例解析在之前的SyntaxFlow教程中&#xff0c;我们已经看到了非常多的代码样例进行数据流分…

广东失业领取指南 记录自己的失业

1. 前言 坐标广州&#xff0c;七月底就被裁员领取n1解放了&#xff0c;趁着这次机会&#xff0c;也想着躺几个月后再去上班&#xff0c;现在工作也不好找&#xff0c;加上之前加班实在是消耗太大了。想着躺也不能干躺&#xff0c;去申请一下失业金每个月还有补贴用&#xff0c…

[数据集][目标检测]锤子检测数据集VOC+YOLO格式1510张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1510 标注数量(xml文件个数)&#xff1a;1510 标注数量(txt文件个数)&#xff1a;1510 标注…

悟空降世 撼动全球

文&#xff5c;琥珀食酒社 作者 | 积溪 一只猴子能值多少钱&#xff1f; 答案是&#xff1a;13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话&#xff1a;悟空》 这只猴子到底有多火&#xff1f; 这么跟你说吧 茅台见了它都…