当前位置: 首页 > news >正文

C++中extern “C“的用法

目的

extern "C"是经常用到的东西,面试题目也经常出现,然则,实际用时,还是经常遗忘,因此,深入的了解一下,以增强记忆。
extern "C"指令非常有用,因为C和C++的近亲关系。

作用

注意:extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。
另外,extern "C"指令仅指定编译和连接规约,但不影响语义。例如在函数声明中,指定了extern “C”,仍然要遵守C++的类型检测、参数转换规则。
综上所述,extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern “C”,表明它按照类C的编译和连接规约来编译和连接,
而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数或变量等。

生成符号的不同

在C和C++中,生成函数符号的方式有所不同。
在C语言中,函数的符号是通过函数名和参数类型来生成的。如果两个函数的名字相同并且参数类型也相同,那么它们的符号就是一样的。
在C++中,函数符号的生成则更加复杂,主要是因为C++支持函数重载,也就是说,两个函数可以有相同的名字,
只要它们的参数类型或者参数数量不同。为了区分这些同名函数,
C++编译器会将函数的返回类型,函数名,参数类型,参数数量,参数顺序等因素考虑进去,生成一个独一无二的符号。

情况

上面理论讲的很清楚,下面用例子试试:

先弄一个C++的函数例子:

cppFunc.h:

#pragma once
#include <stdio.h>
void cppFunc(int num);
cppFunc.cpp:
#include "cppFunc.h"
void cppFunc(int num)
{printf("enter function cFunc num=%d\n", num);printf("exit function cFunc\n");
}

主函数:

#include <iostream>
#include "cppFunc.h"
int main()
{cppFunc(10);std::cout << "Hello World!\n";
}

运行情况:
在这里插入图片描述

符号是这样的:
在这里插入图片描述

c++调用C函数的例子
cFunc.h:

#pragma once
#include <stdio.h>
void cFunc(int num);

cFunc.c:

#include "cFunc.h"
void cFunc(int num)
{printf("enter function cFunc num=%d\n", num);printf("exit function cFunc\n");
}

主函数:

#include <iostream>
#include "cFunc.h"
//#include "cppFunc.h"
int main()
{cFunc(8);//cppFunc(10);std::cout << "Hello World!\n";
}

运行情况:
在这里插入图片描述

上面表明,C++按照C++的函数名规则去链接函数,符号为:?cFunc@@YAXH@Z 实际在OBJ中找不到。
在这里插入图片描述

从上图可知:c语言的名字就是 cFunc,所以找不到。
怎么找到呢?
主函数修改如下:

#include <iostream>
extern "C"
{
#include "cFunc.h"
}
//#include "cppFunc.h"
int main()
{cFunc(8);//cppFunc(10);std::cout << "Hello World!\n";
}

运行情况:
在这里插入图片描述

这样就找到了,这样就按照C的规则去找相应的函数。

总结

extern “C”{},解决了C与C++编译结果的混用,如下图所示:
在这里插入图片描述

相关文章:

C++中extern “C“的用法

目的 extern "C"是经常用到的东西&#xff0c;面试题目也经常出现&#xff0c;然则&#xff0c;实际用时&#xff0c;还是经常遗忘&#xff0c;因此&#xff0c;深入的了解一下&#xff0c;以增强记忆。 extern "C"指令非常有用&#xff0c;因为C和C的近亲…...

常见机器学习的原理及优略势

有监督 一、线性回归&#xff08;Linear Regression) 1. 算法原理 线性回归&#xff08;Linear Regression&#xff09;是一种基本的回归算法&#xff0c;它通过拟合一个线性模型来预测连续型目标变量。线性回归模型的基本形式是&#xff1a;y w1 * x1 w2 * x2 … wn * …...

李诞-2021.8脱口秀工作手册-1-工作的本质是交易;脱口秀是一份和生活分不开的工作,你的全部人生都理应要为你的创作提供养分,为它服务。

1 首先&#xff0c;这是一份工作&#xff0c;工作的本质是交易。 我们在用自己的时间和才能&#xff0c;通过一家公司&#xff0c;与市场交换金钱。 根据诺贝尔经济学奖得主科斯的著名理论&#xff0c;公司会产生的原因&#xff0c;就是人们自己直接与市场交易成本太高&…...

生命在于学习——Python人工智能原理(3.3)

三、深度学习 4、激活函数 激活函数的主要作用是对神经元获得的输入进行非线性变换&#xff0c;以此反映神经元的非线性特性。常见的激活函数有线性激活函数、符号激活函数、Sigmod激活函数、双曲正切激活函数、高斯激活函数、ReLU激活函数。 &#xff08;1&#xff09;线性…...

【C++11】智能指针问题

文章目录 RAII一、auto_ptr二、unique_ptr三、shared_ptrshared_ptr的循环引用问题 四、weak_ptr总结 RAII RAII就是将资源交给一个对象管理&#xff0c;这个对象能进行正常的管理和释放资源。 一、auto_ptr auto_ptr的问题是&#xff1a;在拷贝构造和赋值重载时&#xff0c…...

借助ChatGPT撰写学术论文,如何设定有效的角色提示词指

大家好&#xff0c;感谢关注。这个给大家提供关于论文写作方面专业的讲解&#xff0c;以及借助ChatGPT等AI工具如何有效辅助的攻略技巧。有兴趣的朋友可以添加我&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就…...

成功在服务器liunx-ubantu上安装pytorch

sudo pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118参考链接&#xff1a; 教程&#xff08;部分参考&#xff09; Pytorch官网...

【面试干货】抽象类和接口的区别

【面试干货】抽象类和接口的区别 1、抽象类1.1、什么是抽象类&#xff1f;1.2、示例代码 2、接口2.1、什么是接口&#xff1f;2.2、示例代码 3、比较和总结3.1、使用场景3.2、关键区别3.3、代码示例比较 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&am…...

python爬虫:实现动态网页的爬取,以爬取视频为例

引言: 爬虫也被称为网络蜘蛛(Spider),是一种自动化的软件程序,能够在互联网上漫游,按照一定的规则和算法抓取数据。 爬虫技术广泛应用于搜索引擎、 数据挖掘 、信息提取等领域,是互联网技术的重要组成部分。 摘要: 作为爬虫的初学者,网页越简单越好,因为网页的结构…...

Incredibuild for Mac 来了!

Mac 开发者在寻找适合自己需求的工具时可能会遇到一些困难&#xff0c;因为 Mac 操作系统相对封闭&#xff0c;不像其他系统那样开放和灵活。尽管如此&#xff0c;Mac 开发者在开发应用程序时的需求&#xff08;比如功能、效率等&#xff09;和使用其他操作系统的开发者是类似的…...

递归解析 LXML 树并避免重复进入某个节点

1、问题背景 我们在使用 LXML 库解析 MathML 表达式时&#xff0c;可能会遇到这样一个问题&#xff1a;在递归解析过程中&#xff0c;我们可能会重复进入同一个节点&#xff0c;导致解析结果不正确。例如&#xff0c;我们希望将以下 MathML 表达式解析为 Python 表达式&#x…...

GaussDB技术解读——GaussDB架构介绍(三)

目录 9 智能关键技术方案 智能关键技术一&#xff1a;自治运维系统 智能关键技术二&#xff1a;库内AI引擎 智能关键技术三&#xff1a;智能优化器 10 驱动接口关键技术方案 GaussDB架构介绍&#xff08;二&#xff09;从数据持久化存取层(DataNode)关键技术方案、全局事…...

解锁ChatGPT:从原理探索到GPT-2的中文实践及性能优化

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…...

【WPF】中的ListBox的ScrollIntoView方法使用

在WPF中&#xff0c;ListBox控件的ScrollIntoView方法用于确保指定的项在可视区域内可见。如果该项不在当前的视图中&#xff0c;该方法会滚动列表&#xff0c;使该项出现在视图中。这对于在用户交互或程序逻辑中需要突出显示特定列表项的场景非常有用。但是不会指定滚动的对齐…...

信息安全等级保护测评(等保测评)定级的重要性与实施路径

#等保测评##黑龙江等保测评##哈尔滨等保测评# 在数字化转型的浪潮中&#xff0c;信息安全已成为保障国家安全、社会稳定及企业发展的基石。信息安全等级保护测评&#xff08;简称“等保测评”&#xff09;&#xff0c;作为中国网络安全领域的基础性制度&#xff0c;为组织机构的…...

Python库

Python库 babel huey 图片视频处理 moviepy 一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切、连接、标题插入)、视频合成(也称非线性编辑)、视频处理或创建高级效果 patchworklib 一个专注于图像拼接和合成的Python库 patchworklib 一个专注与图…...

pytest+requests+allure自动化测试接入Jenkins学习

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近在这整理知识&#xff0c;发现在pytest的知识文档缺少系统性&#xff0c;这里整理一下&…...

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念&#xff0c;反而不是其本身的技术。技术上今天可以有Spring春天&#xff0c;明天就可以有Autumn秋天。 核心理念有多重要&#xff1f;就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…...

实体店如何通过私域获取流量?

随着互联网的快速发展和消费者购物习惯的变化&#xff0c;私域流量对于实体店的重要性日益凸显。私域流量是指企业在自己的平台上沉淀的、可以免费使用、多次利用的流量&#xff0c;如微信生态下的朋友圈、公众号、企业微信等。对于实体店而言&#xff0c;有效利用私域流量不仅…...

互联网与人工智能时代:问题的新形态与解答的挑战

随着互联网的普及和人工智能技术的飞速发展&#xff0c;我们仿佛进入了一个答案触手可及的新时代。然而&#xff0c;就在我们以为问题将因此逐渐减少之时&#xff0c;实则问题的形态和内涵正在发生深刻的变化。因此&#xff0c;我们不应简单地将互联网和人工智能视为解决问题的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...