C++ extern关键字

C++中的extern 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

一. extern 关键字

利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,

1、引用同一个文件中的变量

#include<stdio.h>

int func();

int main()
{
    func(); //1
    printf("%d",num); //2
    return 0;
}

int num = 3;

int func()
{
    printf("%d\n",num);
}

按照这个顺序,变量 num在main函数的后边进行声明和初始化的话,那么在main函数中是不能直接引用num这个变量的。

因为当编译器编译到这一句话的时候,找不到num这个变量的声明。

但是在func函数中是可以正常使用,因为func对num的调用是发生在num的声明和初始化之后。

如果我不想改变num的声明的位置,但是想在main函数中直接使用num这个变量,怎么办呢?可以使用extern这个关键字。

利用extern关键字先声明一下num变量,告诉编译器num这个变量是存在的,但是不是在这之前声明的,你到别的地方找找吧,果然,这样就可以顺利通过编译啦。

下面的程序就是利用extern关键字,使用在后边定义的变量。

#include<stdio.h>

int func();

int main()
{
    func(); //1
    extern int num;
    printf("%d",num); //2
    return 0;
}

int num = 3;

int func()
{
    printf("%d\n",num);
}

2、引用另一个文件中的变量

extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。

main.c
#include<stdio.h>
int main()
{
    extern int num;
    printf("%d",num);
    return 0;
}

b.c
#include<stdio.h>
int num = 5;
void func()
{
    printf("fun in a.c");
}

例如,这里b.c中定义了一个变量num,如果main.c中想要引用这个变量,那么可以使用extern这个关键字.

注意只有当一个变量是一个全局变量时,extern变量才会起作用。

注意:

  1. extern 关键字实质上是声明,别的地方必须实现定义。
  2. extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在声明处进行,像这种写法是不行的。
 extern int num=4;
  1. 但是在声明之后就可以使用变量名进行修改了,像这样:
#include<stdio.h>
int main()
{
    extern int num;
    num=1;
    printf("%d",num);
    return 0;
}

使用include将另一个文件全部包含进去可以引用另一个文件中的变量,但是这样做的结果就是,被包含的文件中的所有的变量和方法都可以被这个文件使用,这样就变得不安全,如果只是希望一个文件使用另一个文件中的某个变量还是使用extern关键字更好。

3、引用另一个文件中的函数

extern除了引用另一个文件中的变量外,还可以引用另一个文件中的函数,引用方法和引用变量相似。

main.c
#include<stdio.h>
int main()
{
    extern void func();
    func();
    return 0;
}

b.c
#include<stdio.h>
const int num=5;
void func()
{
    printf("fun in a.c");
}

3. extern 和 static

  1. extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量.
  2. static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面.

首先,static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;

其次,static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;

最后,static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它,如:

 (1) test1.h:
    #ifndef TEST1H
    #define TEST1H
    static char g_str[] = "123456";
    void fun1();
    #endif

    (2) test1.cpp:
    #include "test1.h"
    void fun1()  {   cout << g_str << endl;  }
    (3) test2.cpp
    #include "test1.h"
    void fun2()  {   cout << g_str << endl;  }

以上两个编译单元可以连接成功, 当你打开test1.obj时,你可以在它里面找到字符串"123456",同时你也可以在test2.obj中找到它们。

它们之所以可以连接成功而没有报重复定义的错误是因为虽然它们有相同的内容,但是存储的物理地址并不一样,就像是两个不同变量赋了相同的值一样,而这两个变量分别作用于它们各自的编译单元。

(1) test1.cpp:
#include "test1.h"
void fun1()
{
    g_str[0] = ''a'';
    cout << g_str << endl;
}

(2) test2.cpp
#include "test1.h"
void fun2()  {  cout << g_str << endl;  }
(3) void main()     {
    fun1(); // a23456
    fun2(); // 123456
}

这个时候你在跟踪代码时,就会发现两个编译单元中的g_str地址并不相同,因为你在一处修改了它,在内存中存在了两份拷贝给两个模块中的变量使用。

5. extern 和const

  1. C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,
  2. **但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern const char g_str[];**然后在原文件中别忘了定义: const char g_str[] = “123456”;

所以当const单独使用时它就与static相同,

而当与extern一起合作的时候,它的特性就跟extern的一样了!

参考https://blog.youkuaiyun.com/xingjiarong/article/details/47656339 和 https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

【C/C++实战篇】C语言外部变量extern 和 extern “C“用法详解,C++导入C函数 本文主要介绍了C/C++中extern关键字的用法。extern用于扩展变量和函数的可见性,使其能在不同源文件或同一文件的不同位置使用。对于变量,extern声明变量但不定义;对于函数,extern默认隐含声明。文章通过多个示例展示了extern的使用场景,包括跨文件引用全局变量、提前引用全局变量等。此外,还介绍了C++中extern "C"的用法,用于兼容C语言函数调用。关键点包括:声明可多次而定义只能一次,extern修饰变量时仅声明不分配内存,而初始化时则同时定义。最后说明了头文件 阅读详情

相关推荐

C/C++ extern关键字详解

在C/C++语言中,extern关键字用于声明一个变量或函数,表明其在其他地方定义。在上述代码中,myFunction函数内部使用extern关键字声明了一个全局变量globalVariable。然后在file2.cpp中定义了这个全局变量,并在main函数中使用extern关键字引用了该变量。然后在file2.cpp中定义了这个函数,并在main函数中使用extern关键字引用了该函数。在一个文件中使用extern关键字声明一个函数,可以在其他文件中引用该函数。// 在函数内部声明全局变量。

DevNinja的博客 294

C/C++中 extern用法

声明用来告诉编译器变量的名称和类型,而不分配内存,不赋初值。定义为了给变量分配内存,可以为变量赋初值。注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。

weixin_40933653的博客 1万+

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

C++ 中的 extern

首先明白 C/C++ 中变量的声明和定义是两个不同的概念。声明是指告诉编译器某个符号的存在,在程序变量表中记录类型和名字,而定义则是指为该符号分配内存空间或实现其代码逻辑。凡是没有带 extern 的声明同时也都是定义。而对函数而言,带有 {} 是定义,否则是声明。如果想声明一个变量而非定义它,就在变量名前添加关键字 extern, 且不要显示的初始化变量。// 声明//定义声明变量或函数的存在,但不进行定义,让编译器在链接时在其他源文件中查找定义。当链接器在一个全局变量。

m0_53846807的博客 3017

RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析

本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。

weixin_29161719的博客 166

从零抓包分析AVDTP:用Wireshark解密蓝牙音频传输全流程

本文详细介绍了如何使用Wireshark抓包工具分析AVDTP协议,解密蓝牙音频传输的全流程。从实验环境搭建到信令交互解析,再到媒体流传输深度分析,逐步揭示蓝牙音频传输的技术本质,帮助开发者深入理解AVDTP协议的工作机制。

sun99的博客 203

深入理解c++中.h/.cpp文件,extern关键字,typedef,using关键字

源文件是代码的“具体实现”。它包含了所有在头文件中声明的实体所对应的完整定义。源文件中应该包含什么?头文件的包含:#include "my_header.h",以获取所有声明。函数的完整定义类成员函数的完整实现全局变量的定义(这是该变量唯一被分配内存的地方)为什么要这么做?每个 .cpp 文件都被编译器单独编译成一个目标文件(.o 或 .obj)。这些目标文件包含了实际的机器码。

cyz322649的博客 1432

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

C++中extern关键字使用

chapter 1 . extern关键字的作用     extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义,来看下面的例子。     // extern.cpp : Defines the entry point for the console application. // #

sruru的专栏 9万+

机器学习实战——疫情数据分析与预测

机器学习如何做到疫情可视化——疫情数据分析与预测实战 本文将带领大家爬取11个国家以及中国31个省(自治区、直辖市)在2022.0101-2022.06.19的新冠疫情数据。并且采用机器学习模型对2022.6.20-2022.6.30每一天的全国确诊人数、死亡人数、治愈人数进行预测,**做出疫情可视化图形并且求出最终的相关系数R2!...

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 10万+

如何用libwebsocket库在stm32F407上实现websocket客户端?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1133

c++ 中 extern关键字用法

extern一般是使用在多文件之间需要共享某些代码时。 一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明。 区分是定义还是声明关键在于看计算机是否为变量分配了存储空间。 int num ; //这是定义 extern int num = 1; //这也是定义 extern in...

平凡的脚步也可以走完伟大的行程 1104

自顶向下与自底向上编程思想的对比

一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确

二进制君 830

c++中extern关键字

extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或者其他模块中使用,记住它是一个声明不是定义! 链接指定。当它与"C"一起连用时,如: extern "C" void fun(int a, int ...

you-know-who的博客 7664

Allegro如何用自带的功能将线段变成铜皮操作指导

在做PCB设计的时候,有时根据设计需要将线段变成铜皮,可以借助辅助工具来实现这一操作,但是Allegro自身也自带这个功能,如下图。勾选Delete original objects。如何用自带的功能将线段变成铜皮操作指导。勾选Convert to shape,需要把这段走线变成铜皮。

weixin_54787054的博客 2946

lwip-2.0.3

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

C++中extern关键字

1. 序言extern是一个关键字,它告诉编译器程序中存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义。因此,extern的功能主要为声明外部有一个可用的函数或者变量(通常,这些变量时在cpp或者c文件中定义的),而且这些变量和函数是全局可见的。2. 现代程序编译流程简要介绍在具体讲述extern之前,觉得十分有必要介绍下现代程

Time is a choice 6806

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++关键字】 extern

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

江边小客的博客 391

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++关键字extern

本篇介绍C++语言中关键字extern。实现使多个脚本文件共享使用在某个脚本文件中已经定义声明的变量和函数。 ExternTest.cpp脚本文件 /* * Author:W * 关于extern关键字作用测试类 */ //引入头文件:头文件包含了程序中必需的或有用的信息 #include <iostream> //命名空间使用 using namespace std; //变量定义声明 int v1 = 5; //函数定义声明 void method() { cout <&l

成长ing中的w的专栏 288

C++之extern关键字详解

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern声明不是定义,即不分配存储空间。 先来看一段代码 /* basic_stdy.h */ #ifndef_BASIC_STDY_H_ #define_BASIC_STDY_H_ //extern int a; //在头文件中声明,必须加上extern,否则就是重定义 //void fun(); ...

居老师的博客 3694

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

C++extern关键字

extern在C++中,extern关键字用于声明一个变量或函数是在别的文件或本文件的其他位置定义的,从而可以在不同的翻译单元(通常指不同的源文件)之间共享变量或函数。

Yinrtyu_的博客 366

对于C++中的extern关键字用法的理解

今天在学习Effective C++时遇到了extern关键字,这个关键字我不熟悉,因此参考csdn上一位大佬的博客,总结出如下笔记: 一、首先,明确一点,即:extern是关于声明的关键字: 变量的声明有两种情况: 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。 简单总结:除非有extern关键字,否则都.

weixin_44980842的博客 1628

C/C++关键字中的extern 和 static

extern 关键字的用法, 示例: 在tet.cpp中声明了一个变量,而想在main的主文件中使用这个变量,就可以使用extern关键字来找到这个变量。不需要包含 .h 的方法。 项目目录: tet.cppint a = 5; static int z = 7; void swap_b(int a, int b){ int temp; temp = a; a = b;

迎难而上 717
上一篇: 寻找数组中第K大的元素
下一篇: C++static关键字
Candyerer
博客等级 码龄7年 20粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值