extent C

C语言中的 #ifdef __cplusplus 和 #endif 的作用 C/C++ 语言是一种静态编译语言,编译器在编译代码之前,会先对源代码进行预处理,这些预处理指令是以 # 开头的特殊指令,用来指示编译器完成某些特定的任务。常见的预处理指令包括#define#ifdef#ifndef#include#pragma等。在编译源程序的时候,编译器首先会处理源程序中的预处理指令,将预处理指令替换成相应的代码,最终生成编译后的代码。在编译后的代码中,预处理指令的代码已经被展开或忽略,直接参与编译和链接。 阅读详情

extent C

时常在cpp的代码之中看到这样的代码:

#ifdef __cplusplus
extern "C" {
#endif

//一段代码

#ifdef __cplusplus
}
#endif
  这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

  要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.

  比如下面的一段简单的函数,我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化:

int f(void)
{
return 1;
}
  在加入extern "C"的时候产生的汇编代码是:

.file "test.cxx"
.text
.align 2
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
  但是不加入了extern "C"之后

.file "test.cxx"
.text
.align 2
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
  两段汇编代码同样都是使用gcc -S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。

  明白了加入与不加入extern "C"之后对函数名称产生的影响,我们继续我们的讨论:为什么需要使用extern "C"呢?C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。

  试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件,但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话,那么就会出现链接错误.我们来看一段代码:首先,我们使用C的处理方式来写一个函数,也就是说假设这个函数当时是用C写成的:

//f1.c
extern "C"
{
void f1()
{
return;
}
}
  编译命令是:gcc -c f1.c -o f1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1函数:

// test.cxx
//这个extern表示f1函数在别的地方定义,这样可以通过
//编译,但是链接的时候还是需要
//链接上原来的库文件.
extern void f1();

int main()
{
f1();

return 0;
}
  通过gcc -c test.cxx -o test.o 产生一个叫test.o的文件。然后,我们使用gcc test.o f1.o来链接两个文件,可是出错了,错误的提示是:

test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
  也就是说,在编译test.cxx的时候编译器是使用C++的方式来处理f1()函数的,但是实际上链接的库文件却是用C的方式来处理函数的,所以就会出现链接过不去的错误:因为链接器找不到函数。

  因此,为了在C++代码中调用用C写成的库文件,就需要用extern "C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。

  比如,现在我们有了一个C库文件,它的头文件是f.h,产生的lib文件是f.lib,那么我们如果要在C++中使用这个库文件,我们需要这样写:

extern "C"
{
#include "f.h"
}
  回到上面的问题,如果要改正链接错误,我们需要这样子改写test.cxx:

extern "C"
{
extern void f1();
}

int main()
{
f1();

return 0;
}
  重新编译并且链接就可以过去了.

  总结

  C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。
 

Mac系统VScode运行C++使用万能头文件报错(solved) gcc -v找到路径进入Finder修改路径bits/stdc++.h文件即可 阅读详情

相关推荐

变量(Variable)的作用域(Scope)与生命周期(Extent)

在写正文之前,说一下想重新开始写博客的原因。 前段时间一大学室友来看了我的博客,问我为什么不继续写了。 我仔细想了下这个问题。以前放弃写博客,是因为感觉自己没原创的东西,就算写了下来也没多大意义,在我的博客里能看见的东西,在国外的网站上,在wikipedia上都能找到,而且还更详细。 知识改变行为,行为养成习惯,习惯变成性格,性格决定人生。大多数的人生改变了,世界就改变了。 今天我是想明

云 霄 easypal 1552

#ifdef __cplusplus

#ifdef __cplusplus

wydwja的博客 4871

C11 AMP编程模型与执行模型深入解析

本文将深入探讨C11 AMP(Accelerated Massive Parallelism)的编程模型和执行模型。通过详细解读其核心特性如数组视图(array_view)、范围(extent)、索引(index)、并行计算(parallel_for_each)以及显式数据操作,我们将揭示如何高效地利用C11 AMP进行并行编程,以及如何管理加速器资源以优化计算性能。同时,文章还将解析显式与隐式数据复制之间的差异,并探讨异步操作在C11 AMP中的应用。

weixin_35949153的博客 935

#ifdef __cplusplus语句的作用

本文记录了#ifdef __cplusplus语句的作用

chen_znn的博客 2426

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

【c/c++】c和cpp混合编译

在这段代码中,#ifdef __cplusplus 和 #endif 之间的代码是为了在 C++ 中使用 C 语言的函数声明和定义时,确保编译器正确地处理 C 和 C++ 之间的语法差异。这是因为 C 和 C++ 有一些不同之处,包括函数名的重载、类型转换等。在这段代码中,extern “C” 是一个 C++ 的特性,它告诉编译器要按照 C 的方式来处理其中的函数。:这个条件编译指令检查是否正在编译 C++ 代码。__cplusplus 是一个宏,当编译器编译 C++ 代码时,它会被定义。

Accowo的博客 3844

四参数与七参数坐标转换含义及区别

一.前言 不同坐标系,其椭球体的长半径,短半径和扁率是不同的。比如我们常用的四种坐标系北京54、西安80、WGS84、CGCS2000所对应的椭球体,它们的椭球体参数就各不相同。而不同空间直角坐标系之间的转换一般通过七参数或者四参数来实现坐标转换。 二.四参数转换 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在该模型中有四个未知参数,即: (1)两个坐标平...

尘海折柳的博客 1万+

c语言中extent的用法,extent C

extent C时常在cpp的代码之中看到这样的代码:#ifdef __cplusplusextern "C" {#endif//一段代码#ifdef __cplusplus}#endif这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和...

weixin_35916710的博客 1016

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 512

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 539

c语言中extent的用法,Extend C 用法

extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到。C++中extern “C”含义深层探索extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到。但extern “C” 永远只能在cpp引用时出现,c引用时不允许存在。当cpp引用c中的函数时,需要在cpp使用的头文件中声明...

weixin_31423211的博客 3745

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

btrfs连载(一) test目录代码走读之extent-buffer-test.c

概述:本文作为ceph-btrfs块存储系类的第一遍文章,没想有什么大的出息,只作为记录,而且的确很多的地方不明白希望找到志同道合者共同解疑,本系列的文章都会围绕ceph以及btrfs这两部分展开,首先从btrfs开始,对于btrfs的简要描述不在重复,只求共同弄明白btrfs这个基于btree为基础存储metadata而设计的filesystem的技术细节,并且如果有能力深入,弄明白基于btre

carolove的专栏 1206

SAP SLT 在 carve-out 场景中的关键作用:从理论到实操全景展现

深入剖析 SAP Landscape Transformation(SLT Replication Server)在 carve‑out 场景中的价值,需要从 carve‑out 本身的背景逻辑说起。carve‑out 指的是企业因并购、拆分、剥离商业单元等因素,而将 SAP 系统中某部分业务(例如组织单元、公司代码、模块数据等) separated 出来,导入到独立的系统中。这一过程极具挑战性,既要确保业务连续性,又要实现数据精准迁移和系统隔离 (

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

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1480

oracle12c插入新表中含有BLOB时报错

最近在工作中,在oracle12c的数据库中新建含有BLOB项目的table时报错 ORA-60019:エクステント・サイズ14の表領域にサイズ8の初期エクステントを作成 在网上查找资料的时候发现英文message是 ORA-60019: Creating initial extent of size 14 in tablespace of extent size 8 结论 日文mess...

kuma的博客 929

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

面试宝典:介绍下Oracle数据库动态性能视图 V$TEMP_EXTENT_POOL

面试宝典:介绍下Oracle数据库动态性能视图 V$TEMP_EXTENT_POOL

chenoracle的博客 663

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

面试宝典:介绍下Oracle数据库动态性能视图 V$TEMP_EXTENT_MAP

面试宝典:介绍下Oracle数据库动态性能视图 V$TEMP_EXTENT_MAP

chenoracle的博客 1070

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

终极指南:5分钟掌握WinBtrfs驱动的Windows磁盘I/O请求处理流程

WinBtrfs是一款为Windows系统开发的开源Btrfs文件系统驱动,它让Windows用户能够直接访问和管理Linux Btrfs文件系统。本文将带你快速了解WinBtrfs驱动处理磁盘I/O请求的核心流程,帮助你理解这款强大工具如何在Windows环境下实现高效的文件操作。 ## 什么是WinBtrfs驱动? WinBtrfs作为连接Windows系统与Btrfs文件系统的桥梁,其核

gitblog_01188的博客 838

oracle normal bitmap,深入解析Oracle ASSM结构之Level 1 Bitmap Block

一、概念介绍L1 BMB中存储了一组连续的同一个extent中的数据块空间使用信息,L1内部结构由Cache Header、Header Control及DBA range三层结构组成,Oracle数据块类型代码为“type: 0x20=FIRST LEVEL BITMAPBLOCK”,和L3、L2相同bbed工具同样不支持查询L1的物理结构,本节主要使用C语言解析L1物理结构。Level 1Bi...

weixin_30596433的博客 673

signature=671d6732f3c85aec680ad761c43ab467,Extent of branching from linear viscoelasticity of long-c...

摘要:We present new results and examine literature data concerning the linear viscoelastic behavior of polyethylene with sparse to intermediate levels of long-chain branching (LCB). These branched polym...

weixin_34862449的博客 131

Linux内核文件系统10

2021SC@SDUSC inode.c(1) 今天来分析inode.c文件。有了前面对ext4_jbd2.h、acl.h等头文件的分析做基础,今天的分析将相对简单。 在看代码之前,首先要说一下inode数据结构。inode是Linux内核文件系统中最重要的数据结构之一,里面保存了文件的大小、文件块的大小、创建时间等参数,可以说,一个inode就代表了一个文件。因为软连接、硬连接的存在,指向一个文件的路径可能有多个,即一个文件可以有多个dentry,但是一个文件只能有一个inode。 ext

weixin_46243251的博客 995

深入解析ext4文件系统:大文件与稀疏文件处理机制

文件系统作为操作系统管理存储资源的核心组件,其设计直接影响数据存取效率与可靠性。ext4作为Linux主流文件系统,通过extent树状结构和延迟分配等创新机制,显著提升了大文件处理性能。在存储技术领域,ext4的稀疏文件实现通过智能块管理,为虚拟化环境和科学计算等场景提供高效存储方案。工程师在实际部署时,需要特别关注ext4的块分配策略与xattr扩展属性系统,这些特性在处理视频编辑、数据库备份等IO密集型任务时表现尤为突出。合理利用fallocate预分配和e4defrag碎片整理工具,可以进一步优化存

weixin_34318272的博客 335

达梦数据库ARM版性能调优指南:基于麒麟系统的表空间配置与内存参数实战

本文详细解析了达梦数据库ARM版在麒麟系统下的性能调优策略,涵盖表空间配置、内存参数优化及NUMA架构适配等关键点。通过实测数据展示ARM与x86平台的性能差异,并提供针对飞腾、鲲鹏等国产芯片的优化配置模板,助力金融、政务等领域实现高效国产化替代。

weixin_29290947的博客 387

oracle12c asm 冗余,深入分析:12C ASM Normal冗余中PDB文件块号与AU关系与恢复

原标题:深入分析:12C ASM Normal冗余中PDB文件块号与AU关系与恢复关注“数据和云”,精彩不容错过李敏:云和恩墨交付工程师概述在 10G 和 11G 中,DBA 可以根据文件名,确定这个文件在 ASM 磁盘组上的分布,然后 dd 出来每一个 AU,最后拼凑成一个完成的数据文件。在 12C 的 PDB 中,我们尝试用这种方法,进一步,根据给定的文件号和表的块号,从 ASM 磁盘上 dd...

weixin_35414887的博客 369
上一篇: 预编译头文件
下一篇: vs2005 快捷键
robertkun
博客等级 码龄19年 252粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值