让C++兼容C

C++和C 的兼容性 C++和C的兼容性 1       简介 1.1  C++不是C的超集 C++和C语言关系紧密,在许多集成开发环境中常常可以同时进行这两种语言的开发。C++是面向对象的语言,是由C发展而来。C是过程式编程语言。两种编程语言有很大的交集,但是也存在不同。 1.2  标准 C++: C++11 C: C99, C11 2     不同之处 在C中允许void*赋值给任何指针 阅读详情

作者:冯利美,华清远见嵌入式培训中心讲师。

C++为了与C语言兼容,在符号管理上,C++有一个用来声明或者定义一个C的符号的extern "C"关键字用法:

#ifdef __cplusplus
        extern "C" {
        #endif
        /*...*/
        #ifdef __cplusplus
        }
        #endif

被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。

同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

假设在C++中,模块A的头文件如下:

// 模块A头文件 moduleA.h
        #ifndef MODULE_A_H
        #define MODULE_A_H
        int foo( int x, int y );

在模块B中引用该函数:

// 模块B实现文件 moduleB.cpp
        #include "moduleA.h"
        foo(2,3);

实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

加extern "C"声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h
        #ifndef MODULE_A_H
        #define MODULE_A_H
        extern "C" int foo( int x, int y );
         #endif

在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
        (2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。


一些容易混淆的 C 和 C++ 的不兼容特性 C 和 C++ 是两种不同的编程语言, 特别的, C 并不是 C++ 的子集。 但二者又高度相关。 C++ 自诞生以来, 一直以能够兼容C作为自己的目标之一。 在两种语言的不断演化中, C 和 C++ 都互相从对方身上吸收了不少内容。 举个例子, C99 标准开始支持 C++ 风格的//注释, C++11 标准支持 C99 的long long 整型, 等等。 C 和 C++ 的不兼容大致可以分... 阅读详情

相关推荐

C/C++兼容性

C/C++兼容性C 语言为面向过程的编程语言,C++ 是面向对象的编程语言,有些人也称 C++ 为“带类的 C”。

~心有所依~ 的博客 1778

C++真的能兼容C吗?

今天看到了网上说C是C++的子集,C++可以兼容C,这是真的吗? 要弄明白这个问题,首先,先简单介绍一下这两个语言 C:C语言是一门面向过程的、抽象化的通用程序设计语言。C语言诞生于美国的贝尔实验室,C语言之所以命名为C,是因为他的前身是B语言,经过多年发展,最终在1972年,正式推出。 C++:C++是一种高级程序设计语言,1979年,本贾尼·斯特劳斯特卢普,对C进行了改良工作,改良后,该语言被正式命名为C++。 以据以上介绍,C++确实是从C改进而来,但是,它真的能和C兼容吗?也就是网上说的

. 1万+

避坑指南:STM32CubeMX配置USB虚拟串口时Heap Size设置的那些坑

本文深入剖析了使用STM32CubeMX配置USB虚拟串口时,因Heap Size设置不当导致设备无法识别的常见问题。文章从故障现象出发,详细解释了堆内存不足如何影响USB枚举过程,并提供了从内存布局分析、动态监控到系统化调试的完整解决方案,帮助开发者从根本上避免这一配置陷阱。

ttt77的博客 599

【C++ 语言】 C 与 C++ 兼容 ( extern "C" )

创建项目 项目源码说明 C++ 中直接调用 C 代码 ( 无法解析的外部符号 错误 ) C++ 与 C 编译结果对比 extern "C" 在头文件中的标准用法 最终的 C / C ++ 兼容 代码

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3786

从零到一:ArduPilot无人船PID调参实战指南

本文详细介绍了ArduPilot无人船PID调参的实战指南,从基础参数设定到高级调参技术,帮助用户掌握水面环境下的PID控制逻辑。通过案例分析和参数示例,解决无人船在空载、负载变化及不同水域环境中的航行问题,提升无人船的稳定性和精确度。

weixin_29266647的博客 507

电路保护设计实战:保险丝选型、I²t计算与多级协同方案

电路保护是电子系统可靠性的基石,其核心原理是在发生过流或过压等异常情况时,及时切断故障回路,防止能量持续灌入导致元器件损坏甚至安全事故。从技术价值看,优秀的保护设计能显著提升产品寿命、安全性和市场口碑,尤其在快充、电动汽车等高功率密度应用中,保护器件已成为不可或缺的安全屏障。在众多保护器件中,保险丝作为最基础的过流保护元件,其正确选型与应用直接关系到保护效果。本文聚焦于保险丝选型的实战细节,深入解析了I²t(电流平方时间积)这一关键参数,它定义了熔断所需的能量阈值,是匹配被保护半导体器件耐受能力、实现有效保

weixin_42662171的博客 309

C/C++中过程化语言的区别

  C++是C语言的超集,虽然C++兼容C,但是C++中也有与C语言中不兼容的地方。一、变量声明的位置    C中变量声明和代码是分开的,必须在函数开始处声明;    C++中,变量可以在任意处声明,只要保证先声名后使用的原则就可以。二、struct结构体方面   1、用struct定义变量   struct mystruct    { int i;      float x;   }

flyingjsj的专栏 719

Android应用发布到Google Play的步骤和注意事项

发布Android应用到Google Play是将您的应用分享给全球用户的重要步骤。Google Play是Android平台上最大的应用分发渠道之一,使得开发者可以轻松将他们的应用推广到数百万的用户。在本篇博客中,我们将逐步介绍如何将您的Android应用发布到Google Play,同时提供详细的步骤和注意事项,以及相关的代码示例。

2201_76125261的博客 850

兼容C++的C头文件书写方式

最近在阅读libevent的源码,学到了不少东西,兼容C++的C头文件书写方式就是其中之一。 一 书写方式 下面是event.h文件的源码: #ifndef _EVENT_H_ #define _EVENT_H_ #ifdef __cplusplus extern "C" { #endif #include #ifdef _EVENT_HAVE_SYS_TYPES_H #inclu

寒风的技术博客 4254

从 VL02N 拣配到 ABAP 自动化,读懂 SD_DELIVERY_UPDATE_PICKING 的位置和风险

文章摘要:SAP SD模块中,SD_DELIVERY_UPDATE_PICKING函数模块用于处理出库交货单的拣配确认,更新交货项目的拣配数量。该函数适用于未启用WM/EWM的传统SD流程,能确保拣配状态与标准交货处理逻辑同步,比直接修改数据库更安全。但在S/4HANA Cloud等新环境中,应优先使用API_OUTBOUND_DELIVERY_SRV等公开发布接口。使用该函数时需注意参数完整性和按交货单整体处理的原则,避免逐项提交导致的数据不一致问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

MTK Android 12 Clone Project 克隆项目

本文介绍了如何使用MTK Android 12 Clone Project 克隆一个新的项目。通过使用绝对路径执行Perl脚本,并根据需要选择升级或降级位数,可以成功地生成一个新的项目并进行编译。希望本文对xdm有所帮助。

我其实什么都不会 942

终极指南:如何快速解决RedPanda-CPP中C++与C标准库头文件兼容问题

RedPanda-CPP是一款轻量级C/C++ IDE,基于Qt框架开发,深受开发者喜爱。然而,在开发过程中,许多新手和普通用户经常会遇到C++与C标准库头文件的兼容问题,影响开发效率。本文将为你提供一套完整且简单的解决方案,帮助你轻松应对这些兼容性挑战。 ## 理解C++与C标准库头文件的差异 C++标准库在设计时考虑了对C标准库的兼容,但两者在头文件的命名和使用上存在一些差异。C标准库的头

gitblog_07865的博客 511

商品标签识别系统:基于YOLO系列的深度学习实现

随着零售行业的快速发展和自动化需求的增长,商品标签识别技术变得越来越重要。本文详细介绍了一个完整的商品标签识别系统,该系统基于YOLO系列目标检测算法(包括YOLOv5、YOLOv8和YOLOv10),采用PySide6构建用户界面,并提供完整的训练代码和数据集处理方案。该系统能够准确识别商品标签中的关键信息,如价格、条形码、生产日期等,为零售自动化、库存管理和智能结算提供技术支持。

YOLO 349

C++ 对 C 的兼容性

C++ 对 C 语言的兼容性是,并非完全无缝兼容。这种兼容性主要体现在语法、标准库和运行时特性上,但存在一些关键差异和不兼容点。

weixin_47868976的博客 1521

【实验必备】对AffectNet数据集进行人脸对齐的小Demo

本文首先简单介绍了AffectNet数据集,及人脸关键点等背景知识,接着Po出了人脸对齐的代码及效果展示。注:本文代码参考自FG2021的Emotion-GCN的开源代码,具有一定的可靠性,欢迎大家学习!

信小海 2671

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言和C++有什么区别?

这个问题最权威的回答看看C++语言之父Bjarne Stroustrup是如何讲解的。 由于引进了C++ 这个名字,写出了C++ 的参考手册 [Stroustrup,1984],与C语言的兼容性问题就变成了一个最重要的问题,而且也成为争论的焦点。 还有,到1983年后期,贝尔实验室里负责开发和支持UNIX、生产AT&T的3B系列计算机的分支机构开始对C++ 感兴趣,它已经希望为C++ 工具的开发投入一些资源。不幸的是对于使C++ 的发展由一个人独舞转变为一个公司的支持关键性项目所用的语言

人邮异步社区 1万+

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

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

【C语言】Extern用法--有关cpp与c文件兼容、扩大外部变量作用域等用法的介绍

兄弟萌大家好,我是鸽王Lance。 C语言文件的后缀一般为.c,而C++的后缀为.cpp。这点相信大家都知道。 可笔者在把EasyX函数库给塞进VS2019时,却犯了难:EasyX好像只能在.cpp文件里调用啊! 后来我上网查了下才知道: 由于C++是在C语言基础上发展起来的,故C++兼容C语言的大部分语法,因此,C语言文件保存后缀为.cpp基本没有问题。 请注意,“基本”——这个措辞相当严谨。这意味着,如果不加处理直接将C代码保存为CPP格式,还可能会发生一些兼容性的问题。 如下图: 请看此程序,当输

qq_45695653的博客 950

IDEA的使用指南

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。

HJQD777的博客 2236

c与c++的struct方法兼容调用

之前写jni代码的时候,在jni.h里定义的JNIEnv定义是不同的类,思考了c++与c调用结构体的方法的方式。使用公共的h文件来包含不同的结构体来实现兼容,c++层需要包含c层的结构体指针。 各个文件定义 test.h #pragma once struct classCLay { void(*fun1)(int); }; struct classCppLay { ...

JabamiYu的博客 3119

C++完全兼容C的语法吗?

对于C编写程序,大部分都可以通过,但是不会完全兼容,举两个例子:1.char *str;str = malloc(32); 2.char ch[3] = "abc"; gcc  -g  -o test test.cg++ -g -o test test.c因为C++检查更加严格,C没有这么严格。大家可以比较一下,gcc不会报错,g++会报错。 如

yudingding6197的专栏 2623

详解 C++ 与 C 兼容的接口(如 extern “C“ 函数)

extern "C"这表示foo函数的定义和符号名都遵循 C 语言规则。extern "C"是 C++ 中实现与 C 语言兼容的关键工具。它通过禁用函数名修饰和遵循 C 的链接规则,解决了 C++ 和 C 在符号名上的差异问题。无论是调用 C 库、在 C++ 中定义可被 C 调用的函数,还是编写跨语言兼容的头文件,extern "C"都发挥着不可替代的作用。在开发混合语言项目或��时,正确使用extern "C"是确保成功互操作的基础。

cxyhjl的博客 862

C程序保存为.c文件和.cpp文件的区别

在学习数据结构时,看到老师把C语言和C++混用,并将文件保存为.cpp类型。关于.c文件和.cpp文件的区别,以下是我的一点看法: 1.首先应该明白,C++是在C语言的基础上拓展而来的,因此C++的语法完全兼容C的语法。 2.一般来说,如文件后缀为.cpp,则编译器默认采用C++语法标准进行编译;如文件后缀为.c,则编译器默认采用C语法标准进行编译。 3.由于C++兼容C,因此C语言程序既可...

qq_31239371的博客 1万+

C语言是C++的基础,C++和C语言在很多方面是兼容的。

C语言是C++的基础,C++和C语言在很多方面是兼容的。 C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于它们

u014749300的专栏 1106

c bool 类型检查_浅谈C、C++及其区别、兼容与不兼容

一、闲说CC语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。并且他用B语言写了第一个UNIX操作系统。1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础...

weixin_29770269的博客 289

C++对C的兼容和继承

C++是对C兼容的 #include兼容#include #include兼容#include  #include 另外C有些东西已经很好了,C++就直接继承了,也可以理解为是兼容吧 #include   #include

GROWING 526
上一篇: 颜色知多少-YUV and RGB
下一篇: linux驱动开发方法论
jidonghui
博客等级 码龄17年 15粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值