【C++ Miscellany】如何在同一个程序中结合C++和C

请记住以下几个简单守则:

  • 确定你的C++和C编译器产出兼容的目标文件(object files)。
  • 将双方都使用的函数声明为extern “C”
  • 如果可能,尽量在C++中撰写main
  • 总是以delete删除new返回的内存;总以free释放malloc返回的内存。
  • 将两个语言间的“数据结构传递”限制于C所能了解的形式;C++ structs如果内含非虚函数,倒是不受此限。

Name Mangling(名字重整)

绝对不要重整以其他语言撰写的函数的名称——不论是C,assembler,FORTRAN,Lisp,Forth,COBOL,还是其他任何语言;

要压抑name mangling,必须使用C++的extern “C”指令:

extern "C"
void drawLine(int x1,int y1,int x2,int y2);

extern “C”可以施行于一整组函数身上,只要以花括号封住头尾范围即可:

extern "C"
{void drawLine(int x1,int y1,int x2,int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
}

加入__cplusplus,这个符号只针对C++才有定义,即用于C++时含有extern “C”;用于C时无:

#ifdef __cplusplus
extern "C"
{
#endifvoid drawLine(int x1,int y1,int x2,int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
#ifdef __cplusplus
}
#endif	

Statics的初始化

  • static class对象、全局对象、namespace内的对象以及文件范围内的对象,其构造总是在main之就获得执行,这个过程称为static initialization;
  • 通过static initialization产生出来的对象,其析构必须在所谓的static destruction过程中被调用,发生在main结束之

如果能够,还是尽量在C++中撰写main的好:

extern "C"
int realMain(int argc,char* argv[]); //将C main重命名的realMainint main(int argc,char* argv[])以C++语言完成此函数
{realMain(argc,argv);
}

动态内存分配

程序的C++部分使用newdelete,程序的C部分则使用mallocfree,唯一需要做的就是严密地区分开二者。

数据结构的兼容性

如果你的C++和C编译器有着兼容的输出,两个语言的函数便可以安全地交换对象指针、non-member函数指针、或是static函数指针。很自然的,structs以及内建类型的变量也可以安全跨越C++/C边界。

如果在C++和C之间传递数据,需要限定在C语言支持范围内。

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

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

相关文章

stm32学习笔记:EXIT中断

1、中断系统 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一。 1.中断: 在主程序运行过程中,出现了特定的中断触发条件 (中断源,如对于外部中断来说可以是引脚发生了电平跳变,对于定时器来…

流式数据湖平台实战 | HudiSQL DML

本文介绍SparkSQL提供的几个数据操作语言(DML)操作,用于与Hudi表交互。这些操作包括插入、更新、合并和删除Hudi表中的数据。 1.Insert Into 使用INSERT INTO语句使用Spark SQL将数据添加到Hudi表中。以下是一些示例: INSERT INTO <table> SELECT <columns> F…

Web开发-拦截器介绍

目录 拦截器的主要作用场景&#xff1a;验证用户登录是否有效拦截Ajax请求拦截其他请求 拦截器的主要作用 完成请求参数的解析&#xff0c;将页面表单参数赋给值栈中相应属性&#xff0c;执行功能检验&#xff0c;程序异常调试等工作。在MVC设计模式的框架下&#xff0c;拦截器…

4WE6Y61B/CG24N9Z5L液压电磁阀

特点 1.直动式电磁铁操作方向滑阀作为标准类型; 2.安装面按DIN24 340 A型ISO4401和CETOP-RP 121H;3.电磁铁可任意旋转&#xff0c;线圈可拆卸的直流或交流湿式电磁铁; 4.可不放油液更换线圈; 5.可带有手动应急操作推杆&#xff0c;

打造高效的分布式爬虫系统:利用Scrapy框架实现

在大数据时代的今天&#xff0c;爬虫系统成为了获取和分析海量数据的重要工具。本文将介绍如何使用Scrapy框架来构建一个高效的分布式爬虫系统&#xff0c;以加速数据采集过程和提高系统的可扩展性。 Scrapy框架简介 Scrapy是一个基于Python的强大的开源网络爬虫框架&#xff…

Element UI之Button 按钮

Button 按钮 常用的操作按钮。 按需引入方式 如果是完整引入可跳过此步骤 import Vue from vue import { Button } from element-ui import element-ui/lib/theme-chalk/base.css import element-ui/lib/theme-chalk/button.css import element-ui/lib/theme-chalk/icon.cs…

在网络安全、爬虫和HTTP协议中的重要性和应用

1. Socks5代理&#xff1a;保障多协议安全传输 Socks5代理是一种功能强大的代理协议&#xff0c;支持多种网络协议&#xff0c;包括HTTP、HTTPS和FTP。相比之下&#xff0c;Socks5代理提供了更高的安全性和功能性&#xff0c;包括&#xff1a; 多协议支持&#xff1a; Socks5代…

G1 GC详解及设置

一、概述 G1 GC&#xff0c;全称Garbage-First Garbage Collector&#xff0c;在JDK1.7中引入了G1 GC&#xff0c;从JAVA 9开始&#xff0c;G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器&#xff0c;分区既可以是年轻代也可以是老…

androidx和v4包资源冲突解决方法

一、资源包会报如下错误&#xff1a; 错误类似 (androidx.core:core:1.10.0) 和 (com.android.support:support-compat:24.2.0) 表示资源重复&#xff0c;不知调用androidx包下面的&#xff0c;还是v4包下面的 Duplicate class android.support.v4.app.INotificationSideCha…

一图看懂CodeArts Inspector 三大特性,带你玩转漏洞管理服务

华为云漏洞管理服务CodeArts Inspector是面向软件研发和服务运维提供的一站式漏洞管理能力&#xff0c;通过持续评估系统和应用等资产&#xff0c;内置风险量化管理和在线风险分析处置能力&#xff0c;帮助组织快速感应和响应漏洞&#xff0c;并及时有效地完成漏洞修复工作&…

探索UI设计|栅格系统的深入分析和应用

界面排版太乱了。你知道网格系统的用途吗&#xff1f;网格系统困扰着许多初级网页设计师&#xff0c;就像一个谜。如果您对网格在设计中的应用有任何疑问&#xff0c;本文是为您量身定制的&#xff0c;并深入分析UI设计中网格系统的基本要素和优点。 什么是网格系统 网格系统…

在vite项目中添加Cesium,我们如何让它完美运行?

一、cesium中文网 cesium编程入门(十)优秀资源 | cesium中文网 二、vite-plugin-cesium vite社区插件安装cesium GitHub - nshen/vite-plugin-cesium: ⚡ Vite plugin for Cesium 三、安装插件 npm i cesium vite-plugin-cesium vite -D 四、vite.config.ts 文件中添加…

甘特图组件DHTMLX Gantt示例 - 如何有效管理团队工作时间?(一)

如果没有有效的时间管理工具&#xff0c;如工作时间日历&#xff0c;很难想象一个项目如何成功运转。这就是为什么我们的开发团队非常重视项目管理&#xff0c;并提供了多种选择来安排DHTMLX Gantt的工作时间。使用DHTMLX Gantt这个JavaScript库&#xff0c;您可以创建一个强大…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

消息队列 Kafka

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域 为什么使用消息队列MQ 在高并发环境下&#xff0c;同步请求来不及处理会发生堵塞&#xff0c;从而触发too many conne…

结构体的详细解释

1结构体就是可以存不同的数据类型的成员 2结构体要访问成员的话用.去访问&#xff1b;格式就是&#xff1a;变量.成员 举个例子&#xff1a; 结构体是 struct Student {std::string name;int age;int studentID; };然后创建一个实例对象&#xff0c;并且访问这个对象的数据 S…

【算法|滑动窗口No.1】leetcode209. 长度最小的子数组

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

vsto word属性信息 并读取

要通过VSTO (Visual Studio Tools for Office) 读取和操作 Microsoft Word 文档的属性信息&#xff0c;您可以使用 C# 或 VB.NET 等 .NET 编程语言结合 VSTO 来实现。以下是一个示例&#xff0c;演示如何获取 Word 文档的属性信息&#xff1a;首先&#xff0c;确保您已经在 Vis…

cocos2d-x C++与Lua交互

Cocos版本&#xff1a; 3.10 Lua版本&#xff1a; 5.1.4 环境&#xff1a; window Visual Studio 2013 Lua Lua作为一种脚本语言&#xff0c; 它的运行需要有宿主的存在&#xff0c;通过Lua虚拟栈进行数据交互。 它的底层实现是C语言&#xff0c;C语言封装了很多的API接口&a…

10月12日,每日信息差

今天是2023年10月12日&#xff0c;以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构&#xff0c;也是世界上最大的跨国银行之一 第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景首…