C++与C语言混合编程

c和c++混合使用 我们编写代码,经常需要c和c++混合使用,为了使 C 代码和 C++ 代码保持互相兼容的过程调用接口,需要,为了简化,从而定义了两个宏方面我们使用 1.在 C++ 代码里加上 extern “C” 作为符号声明的一部分。 2.__BEGIN_DECLS 和 __END_DECLS  在C语言代码中头文件中,充斥着下面的代码片段: __BEGIN_DECLS 阅读详情
之前一直以为C++和C语言是一样的,可以很方便的互相调用,昨天想把一个C语言项目编译到C++语言的项目中时才发现,C语言和C++还是有一定区别的,最少互相之间的调用并不像想象中的那么简单。在网上找到了一些资料作为参考,这里也写一下我的互相调用的方法。
参考资料一:
参考资料二:
C语言的引用和C++语言的引用还有一些不同,C语言的引用是真真正正的引用,就像文件复制一样的引用,当你引用一个.c文件时其实就相当于你把那个.c文件又在你的文件中写了一遍一样。他并不是只引用了接口。甚至你都不需要引用任何东西,只要用
extern  void c1fun( char *s);
把你的要用的外部函数声名一下就可以了,编译器会自动从所有文件中查找相关定义的函数,找不到才会报错。如果同时有两个同名且参数类型一样的函数,编译器会报一个重复定义的错误。
下边总结一下,
C++调用C语言
我新建了一个项目,有一个main.cpp的C++文件以及一个main.h的头文件,另外还有一个C语言的.c文件和.h头文件。
main.cpp文件的内容入下:

#include <iostream>

#include <stdio.h>

extern "C" {

#include "testc1.h"

    void c1fun(char *s);

}

int main(int argc, const char * argv[]) {

    // insert code here...


    

    printf("aaaaaaaaaa\n");

    

    c1fun("abc");

    return 0;

}


main.h文件内容为空

testc1.c文件内容:

#include "testc1.h"

void c1fun(char* s)

{

    printf("%s",s);

}


test1.h文件内容也为空


程序运行后的输出结果如下:

aaaaaaaaaa

abc

可见,其实对于C语言来说,头文件是可以没有的。在C++中引用C语言的函数时不用在extern "C"{ }中的声名中函数前再加一次extern了,直接名声要引用的C语言函数就可以了,只要在C文件中有这个函数编译器就会找到并正确引用。

接下来我们看一下

C语言调用C++函数:

接下来再在上边的基础上加一个C++函数:

testcpp1.h接口文件

#ifndef __BTCChinaTool__testcpp1__

#define __BTCChinaTool__testcpp1__


#include <stdio.h>

#include <iostream>

extern "C" {

    void funcpp(char* pstr);

}

void funcpp(char* pstr);

#endif /* defined(__BTCChinaTool__testcpp1__) */



testcpp1.cpp实现文件:

#include "testcpp1.h"

void funcpp(char* pstr)

{

    printf("%s",pstr);

}


同时修改一下testc1.c文件中的方法,在其中加一句调用C++函数的语句。修改后如下:

testc1.c

#include "testc1.h"

extern void funcpp(char* pstr);

void c1fun(char* s)

{s);

    printf("%s",s);

    funcpp("\ncall cpp func...");

}

下边是运行结果:

aaaaaaaaaa

abc

call cpp func...

具体的程序流程是先在C++的main.cpp中调用了C语言的void c1fun(char* s)方法,在输出"abc"字符串的同时,再在这个C语言方法中调到了另一个C++函数void funcpp(char* pstr)函数以输出"\ncall cpp func...".结果输出正确。

可能有人会觉得你调的C++函数不也是和C语言的函数语法几乎一样么。没有用到对象,继承的什么的C++特性。其实并不是你想的这样,C语言的函数和这里的C++函数看起来好像一样,但实际上使用的编译器是不一样的。所以他们可以调用的系统库也是不一样的。像C++中的#include <iostream>在C语言中是没有的,如果你在C语言中引用这个C语言编译器是会报错的。

Seedance2.5本地部署:从环境配置到批量生图的工程实践指南 最近在几个技术社群里,看到不少人在讨论 AI 生图和视频工具。有人抱怨在线服务要么贵、要么慢、要么生成内容受限;也有人尝试了各种“免费”方案,结果不是功能残缺就是暗藏收费陷阱。就在大家觉得“又好又免费”的本地部署方案门槛太高时,Seedance2.5 突然冒了出来,而且口号相当直接:本地部署、完全免费、不联网、功能对标甚至超越一些付费产品。 但这类宣传我们见多了,真正的问题是:它到底能不能在普通开发者的机器上跑起来?生成质量是否真的可用?长期使用会不会遇到模型崩溃、依赖冲突或者资源爆炸?更重要的是,对于一个 阅读详情

相关推荐

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 229

【C++入门】C和C++混合编程超详细讲解

用C语言写功能库代码时,需要对外提供的函数接口头文件用extern “C”{}括起来,将来库无论被C语言调用还是被C++调用都支持;

weixin_42031299的博客 1万+

apm软件仿真+QGC地面站 环境搭建

本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境。qgc地面站位于windows 系统。两个环境在同一台电脑上。 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18。 2.ubuntu下 下载Ardupilot 飞控源码 并配置环境。 下载源码: git clone https://github.com/ArduPilot/ardupilot cd ardupilot git submodule update --init --recursive 配置所需运行的环境:

qthello 6111

混合使用C和C++

混合使用C和C++总述问题使用参考 最近在看项目代码,经常看到header file中,开头: #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ 结尾: #ifdef __cplusplus } #endif /* __cplusplus */ 中间包裹: includes,typedefs,以及function prototyp...

basil1728的博客 3613

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7711

告别手动拖拽!PyQt5/PyQt6 QTableView列宽自适应窗口的三种实战方案(附性能对比)

本文详细介绍了PyQt5/PyQt6中QTableView列宽自适应窗口的三种实战方案,包括Stretch模式、resizeEvent手动计算和ResizeToContents模式,并附有性能对比。帮助开发者解决窗口大小变化时列宽不变的常见问题,提升用户体验和开发效率。

weixin_42538752的博客 234

C与C++混合编程

一、C与C++混合编程的原理 首先,我先了解一下编译的过程。分为四步:预处理(预处理用于将所有的#include头文件以及宏定义替换成其真正的内容)——编译(将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程)——汇编(汇编过程将上一步的汇编代码转换成机器码)——链接(链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件). 可以看下原文,大致了解一下:https://www.cnblogs.com/carpenterlee/p/5994681.html 在

weixin_38956024的博客 5928

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6123

C++:C与C++混合编程

理解混合编程的存在性,知道解决方法。

qq_43441284的博客 1936

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

本文深入解析了AM32电调固件的源码架构与核心模块实现。文章首先介绍了AM32电调作为开源无人机;动力心脏的重要地位,随后从硬件基础、源码目录、模块划分三个维度构建解析框架。重点剖析了系统初始化模块的时钟配置、GPIO初始化和定时器设置,以及FOC控制模块的坐标变换算法、角度估算和SVPWM生成等关键技术实现。通过逐行代码解析,揭示了电调如何将飞控指令转换为电机驱动的完整过程,为开发者理解AM32电调工作原理提供了系统性指导。

bother3000的博客 6568

PD详解—第一章—Type-C连接

Type-C连接 今天大师匈下班比较早,再给大家侃一侃PD,希望大家支持。 PD和Type-c的关系 首先讲一下PD快充的实现步骤,本文主要是Source端(电源),Sink端的差不多也一样,只是策略不同而已。 TypeC连接-->广播电源能力Source capbility(数据交互)->打电压电流->等待其他指令。 所以typec连接是第一步,很多人会从字面意思理解typec连接,这不就是把线给插上去就好了吗? 不知道有没有优秀的同学想到正确答案; 正确答案:typec连接的本质是为

大师匈的博客 1万+

Python3:与C/C++语言的混合编程

python3与C/C++语言混合编程,是一个常用的协作方式,可以结合Python3的方便及强大的库与C/C++的高效与快捷。除了C语言文件外,还需要一个setup.py文件,用于在编译C语文件时使用。可见Python程序成功的调用了C语言程序,实现了混合编程。为平台的名,可以不用关注。......

风静如云的博客 1883

基于WebRTC的现代在线视频会议系统设计与实现

本文详细介绍了如何使用Java和WebRTC技术构建一个完整的在线视频会议系统。我们将从WebRTC的基础原理讲起,逐步深入到信令服务器设计、媒体服务器配置、前后端实现以及高级功能的开发。文章包含大量代码示例和架构图,旨在为开发者提供一套完整的视频会议解决方案。关键词:WebRTC、视频会议、Java、Spring Boot、信令服务器、STUN/TURN、媒体服务器:获取摄像头和麦克风访问权限:处理点对点连接和流传输:实现浏览器之间的任意数据交换。

2201_76125393的博客 189

extern "C" 的含义:实现C++与C及其它语言的混合编程

c++中的extern "c"

huangbo201102的专栏 1130

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++与C语言的混合编程代码示例:extern “C“

这段代码演示了,特别是处理动态内存分配的情况。

学亮编程手记 177

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32 进阶教程 7 -  C与C++混合编程

前言 在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的DEMO程序或驱动程序有时候是C++,如果先前的系统用C语言写的就会出现点问题,往往需先将C++的驱动程序自已手动改成C语言再用,本节给大家介给一下如何在KEL MDK环境中实现C与C++混合编程。本节将在《STM32 进阶教程 4 - 软件实现高精度延时 2》基础上将Delay.c变成C++实现的Delay.cpp编代...

张十三的博客 9132

ARM汇编语言与C/C++的混合编程

ARM公司不生产芯片,而是出售核(如ARM9)给硬件厂商,硬件厂商添加一些外围器件,就成了芯片(如s3c2440)。     ARM汇编语言与C/C++的混合编程 -  在C/C++代码中嵌入汇编指令   在C/C++中使用内嵌的汇编指令语法格式: 使用关键字_ _asm来标识一段汇编指令程序 _ _asm {     汇编语言程序    ~~~~~~~~~~     汇编

SJMP 3893

C 语言与 C++ 语言混合编程的方法

C 语言与 C++ 语言混合编程的方法

m0_60259116的博客 310

VC 2010下使用C++与C语言混合编程时工程设置方法

在VC2010下使用MFC与C语言混合编程时需要经过一个小小的设置,才能让编译器同时编译”.c”文件与”.cpp”文件。 新建好MFC工程后,再添加你想编译的c文件。然后工程界面左侧的Solution Explorer中,对着刚刚添加的c文件,然后点击右键,单击property。在弹出的对话框中,点击窗口左侧的分类,单击c/c++ -> Precompiled Header,并设置如下图

1186

C与C++编译的区别 C和C++混合编译

原文链接,文章不错,修改了排版,看起来更加舒服。 关于extern_C 通常,在C语言的头文件中经常可以看到类似下面这种形式的代码: #ifdef __cplusplus extern "C" { #endif /**** some declaration or so *****/ #ifdef __cplusplus } #endif /* end of __cplusplus */ 那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之..

hpuzsk的博客 3492

C++如何与C语言混合编程_在C++项目中调用C库函数的extern “C“方法

答案是使用extern

2403_88350010的博客 318

c+++c语言混合编程+pdf,C/C++混合编程

前段时间,碰到了C,C++混合编程的需求,经过努力,顺利解决问题.现把这方面的知识做一下简单的总结:1.当C++文件要用到C语言中的函数代码时,采用下属方法即可:在C++中的.h文件或.cpp文件中加入下列代码,#define LINT_ARGS 1extern "C" {#include "system.h"}然后在代码中直接调用这些函数即可.注解:1.1 LINT_ARGS 1表示在检查C语言...

weixin_39847099的博客 104

extern "C" 的含义:实现C++与C及其他语言的混合编程

          C++中extern "C"的设立动机是实现C++与C及其他语言的混合编程。          C++为了支持函数的重载。C++对全局函数的处理方式与C有明显的不同。对于函数void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo。而C++编译器则会产生像_foo_int_int之类的名字。      extern是C/...

weixin_34191845的博客 92

c语言ADD的作用,C语言与C++混合开发?命中会遇见的extern "C"!

原标题:C语言与C++混合开发?命中会遇见的extern "C"! 这个系列进行到这里,我们完成了main方法的本质,命令行参数怎么解析,编译过程,指针的反向思考,以及extern的用途,静态库动态库的拆解,可变参数,static的妙用,inline的内联意义,const为啥还能改?这一节我们来看下一个好玩的内容,就是C和C++的混合编程,我们来逐步拆解,就能够明白。回顾下之前的内容,我们的源码...

weixin_39934613的博客 1533

D语言VisualD中使用C/C++与D语言混合编程

在D语言的工程中,是可以同时使用C/C++代码文件的。 在VisualD中有一个C/C++编译器命令项。默认使用的是微软的C/C++编译器。 下面来测试下C/C++与D的混合编译。先建立一个Console工程,如下图: 接下来添加一个test_cpp.cpp文件和一个test_c.c文件,注意一定要写上后缀,要不就会变成.d文件 建好后如下...

alc080307的博客 733

C语言记账系统实战:内存管理、文件持久化与C++17混合编程

系统编程的核心在于对计算机底层资源,如内存和存储的高效、安全管理。理解内存管理原理和文件I/O机制是构建健壮应用的基础,这些技术能有效提升程序的性能和可靠性,广泛应用于操作系统、嵌入式系统和性能敏感型服务的开发中。通过一个具体的记账系统项目,开发者可以深入实践这些概念,例如手动管理链表数据结构的内存生命周期,设计二进制文件格式进行数据持久化,并规避结构体内存对齐带来的陷阱。同时,引入C++17的现代特性(如std::filesystem、std::string_view)作为工具层,能在不牺牲C核心模块可移

weixin_30431445的博客 225

基于汇编语言与c/c++语言混合编程的程序设计研究(一)

计算机与人们的生活已经紧密的联系在一起,计算机功能的实现主要依靠计算机语言,通过计算机语言编制相应的程序。在涉及到大规模程序设计的时候,采用单一语言就无法发挥应有的优势,不同语言进行混合编程能够实现优势互补,对于实际问题的解决非常有效。本文就基于汇编语言与c/c++语言混合编程的设计研究作简要的阐述。

l754977363的博客 1726
上一篇: 开源硬件仿真库spice 3f5在xcode上编译
下一篇: UE4框架(转)
woodcol
博客等级 码龄19年 288粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值