当前位置: 首页 > article >正文

深入理解C/C++混合编程

在工作中C、C密不可分做我们嵌入式方面的当然更多的是C但有时候却少不了C而且是C、C混搭混合编程在一起的比如RTP视频传输live555多媒体播放等都是C下的他需要调用JRTPLIB库再比如我那邮件发送我也用C写的定义了一个Email对象包含了成员收发邮件地址用户名密码等以及方法邮件头、Base64编码和邮件发送这些操作很好用所以很多时候C还是蛮不错的。。。。但*.c与*.cpp文件混搭在一起不是那么的简单知识总是用时方恨少啊现在我们就来慢慢的了解吧。一、extern“C”的作用最重点1. extern C的真实目的是实现类C和C的混合编程。extern “C”是由提供的一个连接交换指定符号用于告诉这段代码是函数。extern “C”后面的函数不使用的C的名字修饰,而是用C。这是因为C编译后库中函数名会变得很长与C生成的不一致造成不能直接调用C函数。2.C语言支持函数重载C语言不支持函数重载。函数被C编译后在库中的名字与C语言的不同。假设某个函数的原型为void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo而C编译器则会产生像_foo_int_int之类的名字。C提供了C连接交换指定符号extern“C”来解决名字匹配问题。3.被extern C限定的函数或变量是extern类型的extern是C/C语言中表明函数和全局变量作用范围可见性的关键字该关键字告诉编译器其声明的函数和变量可以在本模块或其它模块中使用。被extern C修饰的变量和函数是按照C语言方式编译和连接的。4.与extern对应的关键字是static被它修饰的全局变量和函数只能在本模块中使用。因此一个函数或变量只可能被本模块使用时其不可能被extern “C”修饰。二、extern“C”与__cplusplus#ifdef __cplusplusextern C {#endif#ifdef __cplusplus}#endifCplusplusC plus plus即C用于C文档的头文件中上面代码的意思是如果是C文件*.cpp后缀则使用extern “C”在C项目中应用的非常广泛。即使用gcc编译器编译函数名为C类型如_foo。个人认为搞懂了这两个关键字尤其是理解extern C再次强调不为过呵呵接下来的混合编程也就差不多了哈哈哈。。。。三、C调用C函数接口1.设计程序共四个文件animal.cpp animal.h main.c Makefile1.1 animal.h[rootlocalhost CC]#cat animal.h#ifndef __ANIMAL_H__//防止被重复包含#define __ANIMAL_H__#ifdef __cplusplusextern C {#endifclassANIMAL{public:ANIMAL(char* );~ANIMAL();char* getname(void);private:char* name;};void print(void);#ifdef __cplusplus}#endif#endif // __ANIMAL_H__1.2 animal.cppC文件[rootlocalhost CC]#cat animal.cpp#include animal.h#include iostreamusing namespace std;ANIMAL::ANIMAL(char* data)//构造函数{ name new char[64];strcpy(name, data);}ANIMAL::~ANIMAL()//析构函数{if(name){delete[] name;name NULL;}}char* ANIMAL::getname(void){ return name;}voidprint(void)//对外接口而且必须有一个非类中方法才能被C调用{ANIMAL animal(dog);char* animal_name animal.getname();cout animal name is : animal_name endl;}1.3 main.cC文件[rootlocalhost CC]#cat main.cint main(void){print();return 0;}1.4 Makefile[rootlocalhost CC]#cat Makefilemain:main.c animal.ogcc-lstdcmain.c animal.o -o mainanimal.o:animal.hg -c animal.cpp.PHONY : cleanclean:-rm animal.o main2.测试2.1生成可执行程序main[rootlocalhost CC]#makeg -c animal.cppgcc -lstdc main.c animal.o -o main2.2运行可执行程序main[rootlocalhost CC]#./mainanimal name is :dog四、C调用C函数应该这个比较简单我就不多写了就直接写代码。共有三个文件1.h 1.c main.cpp[rootlocalhost aa]#cat 1.h#ifndef _1__H_#define _1__H_extern void print(char* );#endif[rootlocalhost aa]#cat 1.c#include stdio.h#include 1.hvoid print(char* data){printf(%s\n, data);}[rootlocalhost aa]#cat main.cppextern C{#include 1.h}int main(void){print(“hello,world\n”);return 0;}gcc –c 1.cg main.cpp 1.o接着./a.out又可以出现我们神奇的hello,world了C调用C代码很简单但C调用C接口可把我给累坏了苦啊。就是这个gcc后面跟的-lstdc害的出现undefined reference to __gxx_personality_v0这个错误。是因为你用gcc编译.cpp文件animal.cpp.按系统默认.cpp文件是c的文件格式。当然混搭时我还遇到了其他的一些问题都是一些小问题如果上面解释的还不足以让你解决C\C混合编程的问题可以联系我哦.

相关文章:

深入理解C/C++混合编程

在工作中,C、C密不可分,做我们嵌入式方面的,当然更多的是C,但,有时候却少不了C,而且是C、C混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒…...

3种方式掌控多显示器亮度:Monitorian让你的Windows屏幕管理更智能

3种方式掌控多显示器亮度:Monitorian让你的Windows屏幕管理更智能 【免费下载链接】Monitorian A Windows desktop tool to adjust the brightness of multiple monitors with ease 项目地址: https://gitcode.com/gh_mirrors/mo/Monitorian 你是否曾为Windo…...

CircuitPython开发实战:从环境搭建到内存优化与硬件选型

1. CircuitPython开发环境搭建与核心概念 如果你是从Arduino或者传统的嵌入式C开发转向微控制器编程,第一次接触CircuitPython的感觉,就像是突然有人给你递了一把万能钥匙。过去,点个灯、读个传感器,你得跟寄存器、数据手册、还有…...

CircuitPython嵌入式开发:从代码编辑、串口调试到库管理的完整工作流

1. 从零开始:CircuitPython的嵌入式开发哲学如果你和我一样,是从Arduino或者传统的C语言嵌入式开发转过来的,第一次接触CircuitPython的感觉,大概就像从手动挡汽车换到了电动车。那种“拧钥匙、挂挡、踩离合”的繁琐步骤&#xff…...

nRF52 ADC配置与实战:从原理到电池监测与低功耗优化

1. 项目概述:为什么nRF52的ADC值得你花时间研究? 如果你正在用nRF52系列芯片(比如nRF52832或nRF52840)做物联网设备、可穿戴设备或者任何需要感知物理世界的项目,那么模数转换器(ADC)绝对是你绕…...

小微团队如何利用 Taotoken 统一管理多个 AI 模型密钥与用量

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 小微团队如何利用 Taotoken 统一管理多个 AI 模型密钥与用量 对于小型开发或产品团队而言,在项目开发中集成多个大语言…...

第15章:C++ 日志监控告警

第15章:C++ 日志监控告警 本章定位:第四卷《实战卷》第五篇"生产环境"第 16 章。 一个 C++ 服务上线后能不能"看见"它,能不能"听见"它喊救命,决定了你深夜会不会被叫起来还能在 30 分钟内修好。 目录 01.可观测性三件套 1.1 logs / metrics …...

从零到1打造爆款智能体产品:AI产品经理/经理/开发工程师必备技能图谱!

本文系统梳理了从零到一设计和开发智能体产品的关键知识和技能,覆盖AI产品经理、AI项目经理和AI应用开发工程师三大核心角色的能力要求。内容涉及需求分析、场景选择、产品设计、数据标注、模型评估、AI伦理、项目规划、技术评估、提示工程、RAG技术、Agent架构、工…...

Keil MDK Debug 命令行常用命令

适用&#xff1a;Keil MDK-ARM (uVision5)&#xff0c;进入 Debug 模式后&#xff0c;下方的 Command 窗口或 View → Command Window 打开。一、断点管理 (BKPT / BS / BL) 硬件断点 (Breakpoint Set) BS <func> ; 在函数入口设断点 BS <func&…...

第14章:C++ 代码规范评审

第14章:C++ 代码规范评审 本章定位:第四卷《实战卷》第四篇"工程化与编译链接"第 14 章。 与第 13 章《静态分析工具》构成"机器查 + 人查"互补:能机器查的让 lint 拦,必须人脑判断的进 review。 目录 01.规范与评审定位 1.1 规范的三个层级 1.2 评审解…...

浏览器扩展开发实战:光标交互防火墙的设计与实现

1. 项目概述与核心价值最近在折腾浏览器插件开发&#xff0c;偶然在GitHub上看到了一个名为“Raidu Firewall Cursor Extension”的项目。光看这个名字&#xff0c;就让我这个对网络安全和效率工具都感兴趣的老码农眼前一亮。这玩意儿本质上是一个浏览器扩展&#xff0c;但它把…...

通过Taotoken用量看板与账单追溯精细化管理团队AI支出

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken用量看板与账单追溯精细化管理团队AI支出 对于团队管理者而言&#xff0c;将大模型能力集成到业务中后&#xff0c;一…...

Wonder3D终极指南:如何用单张图片快速生成高质量3D模型

Wonder3D终极指南&#xff1a;如何用单张图片快速生成高质量3D模型 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 你是否曾梦想过将一张普通的2D图片瞬间变成生…...

[4G5G专题] RRU CFR技术:从“削峰”到“塑形”的算法演进与工程实践

1. 从“削峰”到“塑形”&#xff1a;CFR技术的本质蜕变 第一次接触CFR&#xff08;Crest Factor Reduction&#xff09;技术时&#xff0c;我把它简单理解为“信号削峰器”——就像用菜刀切掉蛋糕顶端多余的部分。早期在4G RRU&#xff08;Remote Radio Unit&#xff09;项目中…...

JSON Lint for PHP:让JSON验证不再是一场噩梦

JSON Lint for PHP&#xff1a;让JSON验证不再是一场噩梦 【免费下载链接】jsonlint JSON Lint for PHP 项目地址: https://gitcode.com/gh_mirrors/jso/jsonlint 你是否曾因一个JSON格式错误而花费数小时调试&#xff1f;是否在接收外部API数据时&#xff0c;因为格式不…...

当开源代码也成了「敏感物项」

前两天看到一条新闻&#xff1a;英国国民健康服务体系&#xff08;NHS&#xff09;下令关闭数百个 GitHub 仓库&#xff0c;全部设为私有&#xff0c;原因是安全担忧。 不是某个军用级的加密库&#xff0c;不是核设施控制系统的代码——只是一些普通的医疗数据处理工具。但因为…...

长期使用Taotoken聚合API对项目开发效率的实际影响

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken聚合API对项目开发效率的实际影响 在为期数月的项目开发周期中&#xff0c;我们团队将Taotoken作为所有大模型调用…...

电子取证实战:利用FTK Imager与VMware实现DD/E01镜像的动态仿真与启动

1. 电子取证中的镜像仿真入门 第一次接触电子取证时&#xff0c;我被各种专业术语搞得晕头转向。直到有一次需要分析一个嫌疑人的硬盘镜像&#xff0c;才真正体会到动态仿真的重要性。简单来说&#xff0c;动态仿真就是让存储在DD或E01镜像中的操作系统"活"起来&…...

别再傻傻分不清!5分钟搞懂NMOS和PMOS,从符号到选型一次讲透

5分钟掌握NMOS与PMOS实战技巧&#xff1a;从符号识别到精准选型 1. 初识MOS管&#xff1a;电子世界的交通警察 想象一下&#xff0c;你正面对一堆外形相似的MOS管&#xff0c;就像站在十字路口的交警&#xff0c;需要迅速判断每辆车的行驶方向。NMOS和PMOS正是电子电路中的&quo…...

如何利用 Taotoken 为 Hermes Agent 提供自定义模型支持

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何利用 Taotoken 为 Hermes Agent 提供自定义模型支持 对于使用 Hermes Agent 构建复杂应用的开发者而言&#xff0c;其强大的自…...

为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题 应用场景类&#xff0c;许多开发者使用Claude Code作为编程助手但常…...

项目烂尾的魔咒:为什么你的物联网系统总是“上线即落后”?

在物联网行业有一个令人沮丧的“3-6-12”现象&#xff1a;3个月调研&#xff0c;6个月开发&#xff0c;12个月后项目烂尾或重构。 为什么投入巨资打造的智慧园区或工业互联系统&#xff0c;往往在验收通过的那一刻&#xff0c;就已经开始走向僵化&#xff1f;问题往往不出在硬…...

如何三步轻松下载B站高清视频:BilibiliDown完整使用指南

如何三步轻松下载B站高清视频&#xff1a;BilibiliDown完整使用指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors…...

互斥锁如何避免数据竞争

互斥锁&#xff08;Mutex&#xff0c; Mutual Exclusion Lock&#xff09;是一种用于保护共享资源&#xff0c;确保在任意时刻只有一个线程可以访问该资源的同步原语。其核心目的是解决多线程环境下的**数据竞争&#xff08;Data Race&#xff09;**问题&#xff0c;防止因并发…...

抖音无水印视频下载全攻略:douyin-downloader开源工具终极指南

抖音无水印视频下载全攻略&#xff1a;douyin-downloader开源工具终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallba…...

JiYuTrainer学习自由解决方案:重新定义课堂自主权的教育技术工具

JiYuTrainer学习自由解决方案&#xff1a;重新定义课堂自主权的教育技术工具 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你还记得那种感觉吗&#xff1f;当老师在讲台上演示关…...

从零开始设计千兆交换机:基于RTL8367S/SC芯片的硬件开发包获取与核心电路设计要点

从零开始设计千兆交换机&#xff1a;基于RTL8367S/SC芯片的硬件开发包获取与核心电路设计要点 在当今高速网络设备开发领域&#xff0c;千兆交换机作为基础网络设施的核心组件&#xff0c;其性能与稳定性直接决定了整个网络系统的表现。对于硬件工程师而言&#xff0c;基于RTL8…...

Done!硅谷分拣快递的人类工作,没了

鹭羽 发自 凹非寺量子位 | 公众号 QbitAI美国具身卷到飞起&#xff0c;明星企业Figure再整新活&#xff1a;这一次&#xff0c;他们让机器人进厂打工&#xff0c;8小时不间断直播放送。目前全网热度爆炸&#xff0c;已经吸引超两百万网友围观。无剪辑、完全现场实录&#xff0c…...

Boss-Key终极指南:Windows一键隐藏窗口的完整解决方案

Boss-Key终极指南&#xff1a;Windows一键隐藏窗口的完整解决方案 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你是否曾在办公室突然需…...

告别内网穿透:OpenWrt软路由IPv6配置实战与DDNS部署指南

1. 为什么我们需要IPv6&#xff1f; 最近几年&#xff0c;越来越多的朋友发现家里的宽带已经拿不到IPv4公网地址了。我自己用的移动宽带就是这样&#xff0c;光猫改桥接后用软路由拨号&#xff0c;拿到的永远是个100开头的内网IP。打电话给运营商&#xff0c;客服很客气地告诉我…...