c++中的extern c以使用

2023-05-16

在这里插入图片描述

extern “C”是c++可以正确使用c中代码而产生的,虽然c++兼容c,但是在c++程序调用c的库时,也会产生链接错误。因为c的库中函数的修饰规则与c++的函数修饰规则不同,这会导致,c++程序跑不起来,因为在编译链接时就出了错误。所以c++调用c的库,要使用extern "C"来告诉c++程序,这部分属于c语言的库,调用其中函数需要用c的函数修饰规则。于此,c程序也可以调用c++的库,但是c是不能认识extern "C"的,所以需要在c++的库函数中加入extern “C”。


关于如何在c程序中调用c++的库和在c++程序中调用c的库的问题,在面试题中是会考到的,本文给出以下几种方法,是够用的,回答面试官是妥妥的。

一,在c++程序中调用c的库

(1),将c程序打包成一个头文件和静态库文件,相信大家这个是会的。如果有疑问可以看这个博文《C语言程序的封装》
(2),直接包c程序的头文件就行了。当然不行,上文说过c的函数修饰规则和c++的函数修饰规则不同,所以就到了extern "C"的出场环节了。

extern "C"
{
  #include"touwenjian.h"
}

在extern "C"中报含c的头文件,意在告诉c++程序,包含的函数需要用c的修饰规则。这样就完成了在c++中调用c的库。

二,在c程序中调用c++的库

因为c程序是无法识别extern “C”,并且c程序也无法直接调用c++的库,所以只能在c++的头文件中做文章。
有以下两种方法:
(1)

#ifdef __cplusplus
#define EXTERN C extern "C"
#else
#define EXTERN C 
#endif
EXTERN C void add(int x,int y);
EXTERN C void del(int x,int y);

上面的代码是c++的头文件,在形成c++的静态库时,会识别到__cplusplus,将EXTERN C 定义为extern “C”,从而达到将c++函数修饰成c函数的命名规则的目的。并且如果形成的时c的静态库就会将EXTERN C 定义为空。相当于双重保险嘛。都是为了在c程序中正常运行。
(2)

#ifdef __cplusplus
extern "C"
{
#endif
void add(int x,int y);
void del(int x,int y);
#ifdef __cplusplus
}
#endif

上面这种方法也是可行的,就是相当于在c++库中extern "C"{} 出现,c的库中extern "C"{}隐藏。


以上就是本片内容,希望对大家有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中的extern c以使用 的相关文章

随机推荐

  • c++回调函数/ROS回调函数

    以下均是个人在实际耕码的过程中遇到的问题和整理的结果 xff0c 可能会有不对的地方 xff0c 望各位指正与交流 我会有喵的 c 43 43 中的回调函数 xff1a A 34 callback 34 is any function th
  • r329开发板部署aipu模型

    上篇文章r329模拟仿真实现了在模拟器上仿真网络 xff0c 现在申请到了开发板 xff0c 就有机会在上面测试下了 本文需要的原材料 r329开发板sd 卡sd卡读卡器typec的usb线一台windows电脑一台linux电脑 开发板全
  • centos 网卡 bridge

    Interface configuration example yum install y libvirt virt install bridge utils ifcfg em2 xff1a TYPE 61 Ethernet DEVICE
  • KVM interface passthrough

    nbsp nbsp nbsp nbsp kvm passthrouth sr iov nbsp nbsp https blog csdn net yzy1103203312 article details 81092647 nbsp nbs
  • JNIEXPORT void JNICALL Java_testdll_set(JNIEnv *, jclass, jint j) //i = j;

    例如程序testdll java xff0c 内容为 xff1a public class testdll static System loadLibrary 34 goodluck 34 public native static intg
  • unicode 与UTF8

    utf 8 编码是在传输中或者保存时候是字节码 xff0c 没有大小端的问题 以存储为例 xff1a 不管是英文 xff08 1个字节 xff09 还是中文 xff08 3个字节 xff09 xff0c 不用考虑大小端问题 xff0c 直接
  • sip register超时和invite超时

    sip的register重传与超时 当发送第一个register时候 xff0c 开启定时器 xff0c 超过500ms没有响应 xff0c 重新发送 在发送的register 1s内没有响应 xff0c 在重发 xff0c 一致到32s的
  • 线性地址转物理地址

    二 线性地址转物理地址 前面说了Linux中逻辑地址等于线性地址 xff0c 那么线性地址怎么对应到物理地址呢 xff1f 这个大家都知道 xff0c 那就是通过分页机制 xff0c 具体的说 xff0c 就是通过页表查找来对应物理地址 准
  • H264/H265 PS 流分析

    对于第一帧的第一个包开始为PS头 43 系统头 43 节目映射流 1 Pack start code xff1a 包起始码字段 xff0c 值为0x000001BA的位串 xff0c 用来标志一个包的开始 2 System clock re
  • linux c/c++ 程序崩溃时打印调用栈

    本文章是在总结前人的帖子后实现的 xff0c 经过验证是可以使用的 但是在个别信号下 xff0c 还是不能详细的打印有效信息 void dump void char szLog MAX LOG LEN 61 0 int j nptrs co
  • sip stale

    ii Stale 一个标志 xff0c 用来指示客户端先前的请求因其nonce值过期而被拒绝 如果stale是TRUE xff08 大小写敏感 xff09 xff0c 客户端可能希望用新的加密回应重新进行请求 xff0c 而不用麻烦用户提供
  • C++中模板类的输入输出流重载函数实现

    转 C 43 43 模板类中操作符重载之 34 lt lt 34 和 34 gt gt 34 重载 2011 01 10 17 05 31 分类 xff1a IT与程序 标签 xff1a 字号 大 中 小 订阅 在模板类中输入流 和输出流
  • SIP注册过程

    SIP的注册过程很容易理解 首先我有一个号码 xff0c 但我的号码可以移动的话 xff0c 那服务器如何才能找到我呢 xff1f SIP的注册机制将sip终端的位置报告给注册服务器 这里的注册服务器仅仅是一个逻辑角色 并不一定是独立的物理
  • linux ls命令 目录下文件太多

    在查看一个文件目录下有哪些文件的时候 xff0c 有时候目录下文件太多 所以需要如下命令筛选 ls less 之后按下ctrl 43 F是下一页 xff0c 按下ctrl 43 B是上一页 xff0c 按下q是回去 有时候文件夹内文件数量太
  • protected 构造方法

    使用protected 构造方法 xff0c 是包保护措施 xff0c 出了这个包 xff0c 在别的包里面是不可以new这个对象的 假设class A 的构造函数是protected的 如果在别的包里还想用我这个类的功能 xff0c 只能
  • 简易小工具实现批量打开多个网页

    最近有个需求 xff0c 希望一次性可以打开多个网页 xff0c 网址自由指定 xff0c 这个需求的实现非常简单 xff0c 使用基本的c 43 43 代码调用system函数即可 xff0c 都不需要MFC相关的东西 但是我实测一些工具
  • STM32硬件复位后无法启动

    最近遇到一个很奇怪的问题 xff0c 把STM32的reset脚拉低后再拉高 xff0c 也就是所谓的硬件复位 xff0c 按道理来说 xff0c STM32应该重启才对 xff0c 可是并没有 xff0c 连main函数都没进去 xff0
  • c++ 除号 /

    在c 43 43 中 xff0c 经常会用到整数的除法 xff0c 但是值得注意的是整数的除法是有数据丢失的 整数除法的余数直接被丢弃 xff0c 只取了商的整数部分 不是四舍五入
  • SIP 鉴权 & HTTP 认证

    sip 鉴权是基于摘要签名认证的 具体来说 每一个用户都有一个用户名和密码 用户名和密码在客户端和SIP 服务器的数据库中都有保存 在认证的过程中 客户端将自己的信息 用户名 密码 url 等信息 做一些复杂的MD5 或者SHA256 SH
  • c++中的extern c以使用

    extern C 是c 43 43 可以正确使用c中代码而产生的 xff0c 虽然c 43 43 兼容c xff0c 但是在c 43 43 程序调用c的库时 xff0c 也会产生链接错误 因为c的库中函数的修饰规则与c 43 43 的函数修