【C++】009、extern关键字

【信息科学与工程学】【通信工程】第二百 四十五篇 “意图网络/意图驱动网络(Intent-Based Networking, IBN)1001 意图网络中的任务01 意图网络任务;1. 意图存在性公理:∀需求∃意图表达 2. 可满足性公理:合法意图必可被满足 3. 可验证性公理:意图实现必可验证 4. 可优化公理:意图实现可优化 5. 可组合公理:简单意图可组合为复杂意图 6. 可分解公理:复杂意图可分解为简单意图 数学工具族 → 在IBN/ADN中的落点 集合论与逻辑:意图匹配域、ACL五元组、LTL/μ-calculus合规校验 图论:拓扑、SFC、依赖DAG、跨域意图图、SRv6路径 线性/非线性优化:QoS、容量、切片资源、节能(LP/MILP/凸优化) 排队论 阅读详情

一、extern关键字设计的目的只有一个:那就是跨文件、跨语言地正确找到符号

  • 作为外部声明,告诉编译器变量或函数在别的文件里有定义,让编译器去别的目标文件找查看,先别急着报错。

  • 配合C语言使用(extern “C”),用于禁止C++的符号修饰(Name Mangling)功能,实现C和C++的混合编程

二、extern的基础使用

修饰变量或函数,只做声明,不定义

  • 本质:extern 关键字修饰的声明是承诺,而不是定义,它不分配内存,只是告诉编译器,这个符号(变量/函数)在其他编译单元(.cpp文件)中有定义,请链接时去哪里找。

  • 代码实现

// FileA.cpp
int g_counter = 0;          // 定义(分配内存)
void logMessage() { ... }   // 定义

// FileB.cpp
extern int g_counter;       // 声明(不分配内存),告诉编译器去外部找
extern void logMessage();   // 声明(通常省略,函数默认就是extern的)

void test() {
    g_counter++;            // 链接时去 FileA.obj 找 g_counter
    logMessage();           // 链接时去 FileA.obj 找 logMessage
}

三、extern "C"的底层原理与使用场景

1、为什么需要设计出extern "C"?

  • 一句话总结:为了让C++兼容C,实现在C++程序中调用C语言函数库

  • C语言:符号名就是函数名,比如 void foo(int) 他的符号名就是 foo (注意C语言没有函数重载)

  • C++:支持函数重载,编译器会进行名字修饰,void foo(int) 会被修饰为 _Z3fooi, 在修饰后的符号名会标记参数信息

使用冲突:

  • 如果C++程序要调用一个C语言的库(.so, .a),默认链接时会去找 _Z3fooi,但C语言的库中只有foo,肯定找不到,会报链接错误(Undefined Reference)

2、extern "C"的标准写法

1)直接包裹单个函数

  • 在C++程序中调用C语言函数

extern "C" {
    void c_function(int x);   // 告诉编译器:按 C 的规则去找这个函数
    int c_global_var;
}

2)兼容C/C++两种语言的双编译的头文件中调用extern

  • 既能让C++编译器识别,也能让C编译器识别

  • __cplusplus是C++编译器内置的宏

// my_module.h
#ifdef __cplusplus
extern "C" {
#endif

// 这里是 C 语言接口声明(结构体、函数原型)
void init_module();
void process_data(int* data, int len);

#ifdef __cplusplus
}
#endif

3、类成员不能使用extern “C”

  • extern “C”只能修饰全局函数和全局变量

  • 不能作用域类成员函数,因为成员函数this指针和虚表(vtable),而C语言没有这两个概念

Linux 隐藏进程 这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。 阅读详情

相关推荐

【NLP】文献翻译4——CH-SIMS:中文多模态情感分析数据集与细粒度的模态注释

CH-SIMS: A Chinese Multimodal Sentiment Analysis Dataset with Fine-grained Annotations of Modality摘要1. 介绍2. 相关工作2.1 多模态数据集2.2 多模态情感分析2.3 多任务学习3. CH-SIMS 数据集3.1 数据获取3.2 标注3.3 特征提取4. 多模式多任务学习框架4.1 单模态子网4.2 特征融合网络4.3 优化目标5. 实验5.1 基准5.2 实验的细节5.3 结果和讨论5.3.1 与

YoungSeng's Blog 1万+

C++ extern关键字

C++ extern关键字

Solititude的博客 923

详解在linux上安装vpn客户端

详解在linux上安装vpn客户端

FuncPlotCalc 8425

C++ extern 关键字

对于“在a.cpp文件中使用在b.cpp中定义的函数”这种场景,大家应该非常熟悉。一般会通过在a.cpp中#include "b.h"来解决这个问题。在某些情况下,可能b.cpp文件并没有对应的b.h头文件,这时就需要在a.cpp中使用extern关键字声明b.cpp中的函数。// 声明Utils.cpp中定义的display函数 extern int g_num;// 声明Utils.cpp中定义的全局变量g_num int main() {return 0;

个人技术博客 1521

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1077

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

C/C++中extern关键字详解

1基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int...

fengchuidanliang的博客 1189

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

C++全局变量的定义和声明

本篇文章是对C++全局变量的声明与定义进行了详细的分析介绍, 1、  声明与定义 函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序 编译通过;函数或变量在定义时,它就在内存中有了实际的物理空间。基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。 例如:类A 如果A a;就是一个声明,告诉编译器a是A类的一个对象变量,但是不进行初始

阿兵-AI医疗的专栏 2120

1.5 RAG技术栈全景图:LangChain vs LlamaIndex深度对比,选错框架后悔3年,一文帮你选对

摘要:LangChain与LlamaIndex框架深度对比 本文全面对比了RAG领域两大主流框架LangChain和LlamaIndex。LangChain是通用AI应用框架,具有模块化设计和丰富生态;LlamaIndex专为RAG优化,提供开箱即用解决方案。功能对比显示,LangChain在文档加载和Agent支持方面更强,而LlamaIndex在检索策略、向量存储和多模态处理上表现更优。代码示例展示了二者实现RAG的不同方式:LangChain需要更多配置但灵活性高,LlamaIndex则提供更简洁的A

yonggeit的博客 3238

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 739

C/C++ 知识点:extern 关键字

extern关键字在C++中用于声明一个变量或函数具有外部链接。这意味着该变量或函数的定义在另一个文件中,而不是在当前文件中。使用extern可以避免重复定义,从而实现代码的模块化和组织化。C++中的extern关键字是一种强大的工具,用于声明变量或函数的外部链接。通过使用extern,可以实现跨文件共享和访问,从而提高代码的模块化和可维护性。在使用extern时,需要注意仅声明不定义的原则,并确保每个extern声明都有相应的定义。掌握extern。

个人技术博客 4070

基于Simulink的双PMSM差速驱动转矩同步控制建模示例

本文详细介绍了基于Simulink的双永磁同步电机(PMSM)差速驱动转矩同步控制建模方法。针对AGV/叉车等双电机独立驱动系统的转矩不同步问题,提出主从式+交叉耦合控制策略,在Simulink中实现直线行驶、90°转弯和单轮打滑恢复三种工况的仿真验证。通过动力学建模、参数差异设置、同步误差定义及控制律设计,最终实现同步误差<3%、转弯半径跟踪误差<5%、打滑后100ms内恢复的性能指标。文章特别强调了实际工程中的参数标定、通信同步和故障处理要点,并提供了完整的Simulink建模步骤和工具箱使

xiaoheshang_123的博客 203

C++知识点(一)

C++基本知识点

M021的专栏 640

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

009 函数----功能实现的‘积木块’(函数这一篇就够了!!!)

函数 static extern 函数调用 链式访问

2402_87374751的博客 807

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++基础回顾

在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码// 描述信息/* 描述信息 */:用于记录程序中不可更改的数据。

weixin_45699456的博客 216

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C/C++ C语言整理与归纳

C语言主要特点 C语言是结构式语言 结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。 ...

AtomQQ_2022313691的博客 741

C++基础入门

无

丰锋的博客 2645

C 语言学习笔记

B站up Micro_Frank C语言大师系列课程笔记

g_c_m_g的博客 1221

STM32嵌入式开发从零到一:环境搭建、C语言核心与HAL库实战

嵌入式系统作为专用计算机系统,广泛应用于智能硬件、物联网设备等场景,其开发核心在于对硬件资源的直接控制与高效管理。其工作原理基于微控制器执行特定软件指令,实现对物理世界的感知与控制。掌握嵌入式开发技术,对于构建智能、可靠的电子设备具有重要价值。在众多微控制器平台中,STM32凭借其ARM Cortex-M内核和丰富的生态系统,成为工程师和初学者的首选。本文聚焦于STM32开发的核心实践,详细解析如何从零搭建包含Keil 5和STM32CubeMX的开发环境,并深入探讨嵌入式C语言编程中关于内存管理、位操作、

weixin_33933118的博客 300

C/C++种extern关键字详解

C/C++中extern关键字详解 转自chao_yu,cnblog.com 1基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, ...

youngKui18181818 450

C++基础—— 关键字 extern

C++关键字extern extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义,此外extern也可用来进行链接指定。 extern “C” 的使用 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,在Android JNI 开发过程中我们经常使用以下的代码,处理这个问题: extern "C" { JNIEXPORT void JNICALL Java_com_

qq_25065595的博客 500

C++ 知识要点:关键字

实际上,extern关键字是用于声明的,而不是用于定义的。当你使用extern声明一个变量时,你实际上是在告诉编译器这个变量的定义在别处。但是,你仍然可以在某个地方定义这个变量(通常是.cpp文件中),而不使用extern。然而,在声明时(通常在头文件中),你会使用extern。static关键字在 C++ 中是一个功能强大的工具,它可以用来控制变量的存储期和链接性,以及在类中实现跨对象共享的数据和功能。然而,由于其特殊的性质,使用时需要谨慎考虑,以确保代码的正确性和可维护性。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1216

C++中extern关键字详解:不同情况下的使用方式

C++中extern关键字详解:不同情况下的使用方式

qq_45166271的博客 1125

【C++关键字】 extern

extern 是C/C++语言中表明全局变量或者函数作用范围(可见性)的关键字,编译器收到extern通知,则其声明的变量或者函数可以在本模块或者其他模块使用。extern关键字的作用是共享代码。注意事项:它的作用就是声明函数或全局变量的作用范围的关键字,,不是定义,不分配空间extern可以修饰函数和变量,但是一般不用于函数,重点是用于变量的情况。

江边小客的博客 391

关于C++中的extern关键字

1、变量声明①定义:声明是告诉编译器某个变量的名字和类型,但并不为其分配内存。// 声明变量x,但未定义③用途:声明通常用于告诉编译器该变量将在其他地方定义,或在多个文件之间共享。2、变量定义①定义:定义不仅声明一个变量,还分配了内存空间给它,并初始化(可选)。int x;// 定义变量x,并分配内存③注意:每个变量只能被定义一次,但可以被声明多次。// 声明aint b = 5;// 定义breturn 0;int a = 10;// 定义并初始化a。

qq_46117468的博客 1257
上一篇: 【C++】008、sizeof与strlen的区别
下一篇: 【C++】010、volatile关键字
Tim_10
博客等级 码龄2年 162粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值