c++ 调用c函数

C++入门>>连接规范---extern “C“ 文章目录前言:背景内部名称修饰extern “C”C++项目调用C静态库C静态库的生成C++项目中C静态库的包含于配置、包含配置一配置二效果C项目调用C++库C++静态库的生成效果总结 前言: 本文介绍C++程序中的连接规范》》extern “C” 博主收集的资料New Young,连载中。 博主收录的问题:New Young 转载请标明出处:New Young 背景 在使用不同编程语言进行软件的开发时,需要统一变量,函数名等的链接规范。 如果C++项目中包含C静态库或者动 阅读详情

新博客地址(shankusu.me)

以下内容参考或引用

http://blog.youkuaiyun.com/imcainiao11/article/details/7369447

前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。

首先,为什么要使用extern "C"修饰符?

C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern "C"。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。

Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DeleteStack(struct _Node *)" (?DeleteStack@@YAXPAU_Node@@@Z),该符号在函数 _main 中被引用。

然后是如何使用?

应该怎么使用该语句呢?

刚开始,我简单地在C++源文件的前面使用该语句声明,但是还是出错,而且是在编译阶段就报错。

[cpp]  view plain  copy
  1. error C2732: 链接规范与“DeleteStack”的早期规范冲突。  

为什么会出现这个错误呢?因为C++源文件已经引入了C的头文件,在头文件里,声明该函数时没有extern修饰,而这里有extern修饰,所以冲突了。解决的办法有两个。

一。在C头文件中加上extern修饰符。

直接加,也不行。因为C源文件也包含了这个头文件,当编译C源文件时,就会出现错误。所以,需要一种机制来区分是编译C还是C++文件。方法如下:

[cpp]  view plain  copy
  1. #ifdef __cplusplus  
  2. extern "C"  
  3. #endif  
  4.  void DeleteStack(Stack stack);  


因为在编译C++文件时,自动定义预处理器名字__cplusplus,而编译C时,没有该处理器名字。所以只有编译C++时,才有符号extern “C”。

此外,链接指示extern "C"有单个和复合两种形式。以上为单个形式,复合形式可以同时将几个函数声明为extern "C"

[cpp]  view plain  copy
  1. extern "C" {  
  2. void DeleteStack(Stack stack);  
  3. void PrintStack(Stack stack);  
  4. void Pop(Stack stack);  
  5. }  


加上预处理器名字如下:

[cpp]  view plain  copy
  1. #ifdef __cplusplus  
  2. extern "C" {  
  3. #endif  
  4.   
  5. void DeleteStack(Stack stack);  
  6. void PrintStack(Stack stack);  
  7. void Pop(Stack stack);  
  8.   
  9. #ifdef __cplusplus  
  10. }  
  11. #endif  


二。编写一个C++风格的头文件,在这里添加extern修饰符。

使用方法一,很简单。但是如果该头文件是别人写好,你无法修改。这个时候就要使用其它方法了。方法是定义C++自己的头文件,文件名为"CStack.h"

[cpp]  view plain  copy
  1. // CStack.h  
  2. extern "C" {  
  3. #include "Stack.h";  
  4. }  

​C&C++——C函数与C++函数相互调用问题​ 目录 序 嗨,这里是狐狸~~ C&C++相互调用 下面摘录一篇文章关于extern "C"的说明; extern "C"的惯用法 C 函数中调用 C++函数 举例: Linux C调用C++库 C++和C语言函数相互调用 1.引言 2.从标准头文件说起 3.深层揭密extern "C" 4.extern "C"的惯用法 总结 序 我爱你,你对我来说,就是早晨的面包。 嗨,这里是狐狸~~ 今天来给大家继续分享C/C++的学习心得,内容很多,知识点很多,耐心观看。.. 阅读详情

相关推荐

c文件函数调用c++文件函数的编译方法

为什么要在c文件函数里调用c++文件函数? 很多现有代码都是c语言写的,我们需要对其进行扩展时,如果需要用到模板或类时,就需要使用c++编写,而且c++提供了STL,可以很方便的实现一些功能,所以使用c++编程可以减少工作量。 如何在c项目里编写c++文件代码? 将函数申明放在头文件中 把要被c函数调用的c++函数的申明放在extern "C"{ ... }语句块里 标准c++的头文件包含不能放...

hfq0219的博客 3368

链接规范与的早期规范冲突的解决办法

方法一: 全部用C++的函数替代含有.h的函数(头文件除外) 方法二: #ifdef __cplusplus 6 extern "C" { 7 #endif 8 /*...*/ 在此处添加需要引用的函数定义 9 #ifdef __cplusplus 10 } 11 #endif 建议使用方法二,一句话兼容C和C++语言,因为C和C++同一个函数名在编译后保存在内存中的函数名...

Sean要加油 1万+

C++(03):调用C语言函数

解决此问题,只需通过extern “C”来声明C语言的函数,以此告之C++程序采用C语言的编译规则来链接函数。

风静如云的博客 2160

VS2010 中 error 2732: 链接规范与的早期规范冲突

error 2732: 链接规范与的早期规范冲突 : 方法一解决方法是:全部用C++的函数替代含有.h的函数(头文件除外) 方法二:#ifdef __cplusplus extern "C"{ #endif 自己写的函数声明 } 推荐方法2.。一句话兼容C和C++语言,因为C和C++同一个函数名在编译后保存在内存中的函数名很有可能不同。。。

ZhouRush 1万+

Altium Designer许可证冲突?手把手教你用Windows防火墙彻底禁止AD联网(附详细截图)

本文详细介绍了如何通过Windows防火墙精准管控Altium Designer的网络权限,解决许可证冲突问题。通过配置入站和出站规则,彻底阻断AD的联网行为,提升软件运行效率。适用于需要稳定使用Altium Designer的工程师,附有详细截图和高级验证方法。

weixin_38170137的博客 423

安川机器人SOCKET 通讯

命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...

记录学习内容 8285

C++调用C函数

前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。 首先,为什么要使用extern "C"修饰符? C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern "C"。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。 Test.obj :

Imcainiao11的专栏 3万+

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1528

C++(十四)之C++中调用C函数

本篇文章我们主要讲解在C++中如何调用C语言的函数。 在我们之前的积累中,一些写好的程序模块用C已经完成了。 但是C++项目中又要重新写这些功能。 这个时候我们可以透过以下方法直接调用之前的函数模块。 下面我们举例说明: 三个文件总共: cppCallCFun.cpp CModule.c CModule.h cppCallCFun.cpp: /*******...

shao15232的博客 885

超螺旋滑模控制(STA)

超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。

Lyajpunov的博客 1万+

Ubuntu系统等保3级配置核查与加固

虽然这种方法在某些老旧的系统中仍然有效,但现代Linux发行版通常不推荐使用hosts.deny和hosts.allow文件来管理防火墙规则,因为它们的功能已经被更现代的防火墙管理工具(如iptables或firewalld)所取代。如果你想禁止特定的环境变量,可以从这个列表中移除它们,或者如果你想完全阻止所有环境变量的传递,可以将其设置为空。你可以通过ssh-keygen生成密钥对,并将公钥添加到用户的~/.ssh/authorized_keys文件中。修改配置后,需要重启SSH服务以使更改生效。

悦分享 183

【C++】四、inline函数、C/C++相互调用

一、inline函数 (一)inline函数的概念 (二)inline函数 && 宏 (三)inline函数 && static (四)inline函数 && 普通函数 (五)内联函数的缺点及使用建议 (五)内联函数的限制 二、C/C++相互调用 (一).cpp文件中调用.c文件中的函数 (二).c文件中调用.cpp文件中的函数 1. .cpp源文件允许修改 2. .cpp源文件不允许修改

qq_43411555的博客 1368

31、Labview如何搭建程序框架?--状态机到数据采集等常用框架

本文废话不多,直接列举几种框架搭建方式,为了尽量向大家提供干货,本文直接从简介和手把手教搭建框架两方面来讲解,本文提到五种经典框架模式,学会这五种就很够了,分别是:状态机框架(State Machine)、生产者-消费者框架(Producer-Consumer)、主-从框架(Master-Slave)、事件驱动框架(Event-Driven)、分层架构(Layered Architecturep)。这个框架是基于状态机结构的。顾名思义“状态机”就是个“切换程序状态的机器”。本质是一个。

关注我,更多技术问题欢迎私聊~ 3101

如何从C中调用C++函数

从C++中调用C的函数很简单,只需要加 extern “C” 就行,但是在C中调用C++函数就会复杂很多,毕竟C++能兼容C,但是反过来就不行。推荐使用静态库,在板端用动态库使用有些问题,还没测试成功。

qq_41902848的博客 1335

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

GStreamer中h264parse元素

h264parse是 GStreamer 中处理 H.264 视频流的关键元素,主要负责解析和准备 H.264 流以便后续处理。

深之JohnChen的专栏 1022

c语言调用cpp函数_cpp函数的调用和重载详解

函数调用函数在源代码中被调用过程被称为函数调用。标准的C++是一种强制类型检查的语言,在调用函数前,必须把函数的参数类型和返回值类型告知编译。注:首先被调用的函数必须是已经存在的函数(是库函数或用户自定义的函数)如果使用库函数,还需要将库函数对应的头文件引入,这需要使用预编译指令#include。如果使用用户自定义函数,一般还应该在主调函数中对被调用的函数作声明。C++和C不同,简单地用不同的原型...

weixin_29196315的博客 2948

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++调用C文件函数简单应用

通常情况下,编程都是用同种语言(或说格式),这样不大会出现不同语言这间的错误 下边介绍一下,在C++语言(.cpp文件)下调用C语言(.c文件)的一种方法(下边分别是三个文件): /*Duke.cpp,编译环境:VC6.0*/ #include #include "Duke.h"//包含.c的头文件(下边用到.c里的add函数) using namespace std; int main(

任逍遊 --- [专用空间] 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

在.cpp文件中调用.c文件中的函数

问题描述: 提示:今日需要在c++项目中调用GMSSL中的SM2的相关函数接口。在包含头文件,链接动态库 .cpp中调用GMSSL(c语言库)的函数的代码: @Override #include <openssl/bn.h> #include <openssl/ec.h> #include <openssl/evp.h> #include <openssl/rand.h> #inc

qq_40123036的博客 2683

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言调用c++函数,c与c++的相互调用

最近项目需要使用google test(以下简称为gtest)作为单元测试框架,但是项目本身过于庞大,main函数无从找起,需要将gtest框架编译成静态库使用。因为项目本身是通过纯c语言编写,而gtest则是一个c++编写的测试框架,其中必然涉及c与c++之间的相互调用。注意,本文的前提是,c代码采用gcc等c语言编译器编译c代码,采用g++等c++编译器编译c++代码,如果c和c++代码统一使...

weixin_35867508的博客 4869

32GB显存跑56GB大模型:异构内存架构实战指南

统一虚拟内存(UVM)和KV Cache是现代AI推理中突破显存瓶颈的核心技术概念。其原理在于通过硬件支持的异构内存管理协议,实现GPU显存、CPU内存与NVMe存储的统一地址空间映射与按需分页调度;技术价值体现在显著降低大模型部署的硬件门槛,提升资源利用率与服务吞吐;典型应用场景包括vLLM推理服务、多租户API网关及长上下文生成任务;本文聚焦Shared Memory从CUDA原语到全栈异构内存协同的工程演进,结合UVM配置、PagedAttention调度与NUMA对齐等实操细节,系统拆解如何让32G

weixin_34032621的博客 1334

C中调用C++函数

C中调用C++函数 文件结构: src c main_c.c cpp main_cpp.c inc main_c.h main_cpp.h obj makefile // src/c/main_c.c #include "main_cpp.h" #include "main_c.h" int main_c(){ return 0; } int c_add(int a, int b){ return a + b; } int c_sub(int a, int

Lotuscc的博客 1396

c调用c++函数

c调用c++普通函数 cpp_test/cpp.h #ifndef CPP_H #define CPP_H #include "extern_cpp.h" int add(int a, int b); char add(char a, char b); #endif // CPP_H cpp_test/extern_cpp.h ...

weixin_33881140的博客 774

C 和 C++ 中主函数调用其他文件中的函数,实现代码重用

C 和 C++ 中主函数调用其他文件中的函数,实现代码重用

kklv__lo的博客 1656

Cpp调用C中的函数

在C文件对应的.h文件中加入以下红色部分: #ifndef _XXXXX_H_ #define _XXXXX_H_ #ifdef __cplusplus extern "C" { #endif void **********(void); //需要引用的函数若干 ..... ..... #ifdef __cplusplus } #endif #endif ...

皈依 1644

怎样在c++中调用c语言的函数

很多小伙伴可能会在编程中遇到这样的问题,那就是在c++文件中调用c语言的函数会发生报错,那么为什么会出现这种情况,又该如何解决呢?例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何在c++文件中调用c文件的函数,希望可以给大家带来帮助。...

weixin_59371851的博客 6071
上一篇: qt5 中文乱码
下一篇: 模块计算机类型x64与目标计算机类型X86冲突
shankusu2017
博客等级 码龄15年 155粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值