c++ extern const and static

【C++】作用域、const、static、extern、#define 使用 #define 预处理器。使用 const 关键字。 阅读详情
extern 函数声明
  常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?
  答案与分析:
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f(); 和int f();
  当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。关于这样做的原因和利弊可见下面的这个例子:“用extern修饰的全局变量”

    (1) 在test1.h中有下列声明:
    #ifndef TEST1H
    #define TEST1H
    extern char g_str[]; // 声明全局变量g_str
    void fun1();
    #endif
    (2) 在test1.cpp中
    #include "test1.h"
        char g_str[] = "123456"; // 定义全局变量g_str
        void fun1() { cout << g_str << endl; }
    (3) 以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了
    #include "test1.h"

     void fun2()    { cout << g_str << endl;    }

    以上test1和test2可以同时编译连接通过,如果你感兴趣的话可以用ultraEdit打开test1.obj,你可以在里面找到"123456"这个字符串,但是你却不能在test2.obj里面找到,这是因为g_str是整个工程的全局变量,在内存中只存在一份,test2.obj这个编译单元不需要再有一份了,不然会在连接时报告重复定义这个错误!

extern 和 static

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

    static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而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中找到它们,它们之所以可以连接成功而没有报重复定义的错误是因为虽然它们有相同的内容,但是存储的物理地址并不一样,就像是两个不同变量赋了相同的值一样,而这两个变量分别作用于它们各自的编译单元。 也许你比较较真,自己偷偷的跟踪调试上面的代码,结果你发现两个编译单元(test1,test2)的g_str的内存地址相同,于是你下结论static修饰的变量也可以作用于其他模块,但是我要告诉你,那是你的编译器在欺骗你,大多数编译器都对代码都有优化功能,以达到生成的目标程序更节省内存,执行效率更高,当编译器在连接各个编译单元的时候,它会把相同内容的内存只拷贝一份,比如上面的"123456", 位于两个编译单元中的变量都是同样的内容,那么在连接的时候它在内存中就只会存在一份了,如果你把上面的代码改成下面的样子,你马上就可以拆穿编译器的谎言:
    (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地址并不相同,因为你在一处修改了它,所以编译器被强行的恢复内存的原貌,在内存中存在了两份拷贝给两个模块中的变量使用。正是因为static有以上的特性,所以一般定义static全局变量时,都把它放在原文件中而不是头文件,这样就不会给其他模块造成不必要的信息污染,同样记住这个原则吧!

7. extern 和const

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

    所以当const单独使用时它就与static相同,而当与extern一起合作的时候,它的特性就跟extern的一样了!所以对const我没有什么可以过多的描述,我只是想提醒你,const char* g_str = "123456" 与 const char g_str[] ="123465"是不同的, 前面那个const 修饰的是char *而不是g_str,它的g_str并不是常量,它被看做是一个定义了的全局变量(可以被其他编译单元使用), 所以如果你像让char*g_str遵守const的全局常量的规则,最好这么定义const char* const g_str="123456".



Static、Extern、Volatile及Const关键字总结 Static、Extern、Volatile及Const关键字总结 关键字static                                                                                                                          关键字Const有什么作用? static在C中主要用于定义全局 阅读详情

相关推荐

C++关键字之const、inline、static、extern

C++关键字之const、inline、static

yohnyang的博客 1833

C++ 关键字汇总(避免作为变量名使用)

asm asm (指令字符串):允许在 C++ 程序中嵌入汇编代码。 auto auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。 bool bool(布尔)类型,C++ 中的基本数据结构,其值可选为 true(真)或者 false(假)。C++ 中的 bool 类型可以和 int 混用,具体来说就是 0 代表 false,非 0 代表 true。bool 类型常用于条件判断和函数返回值。 .

源代码杀手的博客 1380

高分7(GF7)卫星数据制作平原地区DSM/DEM(三)——可信度分割

李国春(接上)

副组长的博客 1714

C++ static extern const

1.static。 不同的cpp文件中可以定义同名的static变量。如:static int kk = 3; 这样不会造成重定义的问题,因为static作用范围是单个编译单元。每个编译单元会开辟独立的空间来存储kk变量。并且无法用extern在其它cpp文件中使用。 2.extern extern与static不能一起使用,其作用范围是工程的全局范围。如果在多个cpp中重复定义了同名extern...

haiku的博客 506

基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践

本文聚焦企业级报告生成场景中 “在线编辑模板 + 动态数据填充” 的核心需求,详细阐述基于 POI-TL、OnlyOffice 与 MinIO 的全栈实现方案。通过代码示例拆解模板加载、文字填充、图表匹配渲染(含通过关系 ID 关联图表与段落的关键逻辑)、报告存储全步骤。最终通过技术组合实现业务人员可视化编辑模板、后端高效填充数据的目标,为同类动态 Word 生成需求提供可复用的实践参考。

imHanweihu的博客 1866

FlinkCDC数据同步Bug——同步性能由于写入并行度限制无法提升问题的解决

使用FlinkCDC进行数据同步时,出现增量阶段写入并行度强制为1导致整体同步性能无法提升问题的解决方案

csdn_lan的博客 2078

extern、static、const关键字

在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义。但是这样定义的变量通常被称为局部静态变量,它的值的不会因为函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上衣次调用结束后的值。说到作用域,我们需要说明,尽管使用extern关键字修饰的变量,其原本都是全局变量,但如果extern int var声明处于某一函数体内,那么其作用域就在函数体内。关键字修饰的变量,在声明时必须进行初始化。

sycc512的博客 1316

人工智能之语言领域 自然语言处理 第六章 情感分析

情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),旨在自动识别和提取文本中表达的主观情感、态度或情绪。从用户评论到社交媒体,从产品反馈到政治舆情,情感分析已成为企业决策、品牌监控和人机交互的关键技术。本章将深入介绍情感分析的层级结构、核心技术、主流模型,并通过社交媒体舆情实战案例完整演示分析与可视化流程。层级目标示例词级(Word-level)判断单个词的情感倾向“好” → 正面;“差” → 负面句级(Sentence-level)判断整个句子的情感极性。

咚咚王者的博客 856

39. C++ 链接性之extern和static和const的用法

static 作用范围是内部链接的关系, 和extern有点相反,它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,,而static 不可以,只允许对象本身用它。也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在链接时从模块A生成的目标代码中找到此函数。此外extern也可用来进行链接指定。

谢谢大家的关注 956

比亚迪璇玑架构:10ms级响应引领智能驾驶革命

比亚迪璇玑架构通过三大创新,实现10ms级控制响应时延,使AEB刹车距离比竞品缩短20米。

百态·数智思维 | 聚焦大数据、量化与未来AI 1256

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5759

C++几个关键字总结——const、static、extern、volatile

1.const const 基本原理 : 被修饰的对象的值不可以被修改 const推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。 (1)const修饰基本数据类型 表示常量,必须进行初始化,有以下两种初始化的方式: 编译时初始化: 编译器在编译时会把所有用到j的地方都替换成对应常数,如const int a=42;,即这种情况下,编译器是不为常量a分配内...

波波鱼的博客 2393

127. 答网友疑问:ABAP Function Module 如何支持内表结构不确定的动态输入参数

ABAP RTTI 的全称是 Runtime Type Identification. 使用 RTTI,ABAP 开发人员可以在运行时获取关于数据对象的各种信息,包括其数据类型、字段列表(如果数据是Structure 或者内表的话)以及这些字段的技术属性,比如字段名称,字段数据类型,长度等等。对于这些字段信息,ABAP 提供了一组特殊的类和接口,包括 CL_ABAP_TYPEDESCR、CL_ABAP_STRUCTDESCR、CL_ABAP_TABLEDESCR 等等。

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

C++ 变量作用域 & 存储期 & 链接性:const / static / extern 全面解析

本文详细解析了C++中const、static和extern三种变量作用域关键字的核心用法与区别。const提供只读语义保护数据(区分顶层/底层const),static可延长变量生命周期或限制作用域(局部静态/文件静态/类静态),extern则实现跨文件引用。文章通过代码示例展示了三者在函数参数、成员变量、多文件工程中的典型应用场景,并指出常见误区(如const全局变量默认内部链接)。最后总结了工程实践中的最佳用法组合,包括公共常量定义、模块封装和C/C++互调方案,为开发者提供了一套可直接套用的编程模式

冰冻三尺非一日之寒 1079

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++存储类auto、static、extern

如果定义一个全局变量,没有使用static关键字限定,则链接器会跨编译单元(通常指源码文件+头文件)进行链接,可能会造成意外Bug。(C++17已弃用)通常情况下,const 成员函数不能修改对象的状态,但如果某个成员变量被声明为 mutable,则可以在 const 函数中对其进行修改。在多文件程序中,可以只在一个文件中定义一个全局变量,而在使用该变量的其它文件中用关键字extern声明,实现跨文件共享。mutable 关键字,用于修饰类的成员变量,允许在const成员函数中修改这些变量的值。

weixin_43540379的博客 1966

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【C/C++】extern、static、const

文章目录一、extern三、extern 和 const 一、extern 如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别: extern int f(); int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。关于这样做的原因和利弊可见下面的这个例子:“用extern修饰的全局变量” (1) 在test1.h

Hello,My Friends~ 843

数学建模模型总结

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

【C++基础】Day 4:关键字之 new、malloc、constexpr、const、extern及static

本文对比分析了C++中三组关键概念:1. new/delete与malloc/free:new/delete是C++运算符,具有类型安全、自动调用构造/析构函数、可重载等特点;而malloc/free是C函数,仅分配原始内存块,不保证类型安全。2. constexpr与const:constexpr强制编译期常量计算,用于模板参数等场景;const仅表示只读,不保证编译期确定。3. extern与static:extern用于声明外部符号,实现多文件共享;static则限制符号作用域,延长变量生命周期,并支

冰冻三尺非一日之寒 1166

C++语法|C++八股|const、static、define、inline、constexpr、volatile、extern、std::atomic

变量:当用于变量时,constexpr指示该变量的值在编译时是已知的,并且是常量表达式。函数:当用于函数时,constexpr指示函数可以在编译时求值,前提是所有参数都是常量表达式,并且函数体符合constexpr函数的要求。

糖炒栗子 1028

【c++】c++常见关键词const、static、extern、explicit含义

const、extern、static、explicit

zwan0518的专栏 1619

C++ 修饰符const、static、extern、ref、volatile、explicit总结

C++里面有不少知识点是与其本身的关键字紧密结合的。本文即讲到了常用的const、static、ref、enum,也会介绍一些不太常用或者一些较新的关键词:extern、volatile、auto、decltype、constexpr、explicit,最后再附带介绍了一下C++正则regex方面的知识。这里注意ref包括左值引用、右值引用两大部分,其中右值引用一般较少见。

机器学习 2679

c++ extern的用法,extern全局变量和static、const的的区别

作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。 作用二:当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。

deyuzhi的专栏 1万+

C++中的extern和const总结

作者:云梦泽 时间:2013.11.08 出处:http://write.blog.youkuaiyun.com/postlist 声明:版权所有,侵犯必究,如有转载请声明出处 一、extern extern用于告诉编译器存在着一个变量或者函数,当前编译语句前如果没有定义的话,那么该变量或者函数定义在文件的后头或者其它文件中,即提示编译器遇到此变量和函数时在其他模块中寻找其定义。且必须加上修饰符说明

《致青春》——云梦泽 8714

c语言extern与const,static、const、extern的正确使用方式

static、const、extern的正确使用方式1.extern全局变量extern,也称之为外部变量,是在方法外部定义的变量。它不属于那个方法,而是属于整个源程序。作用于是整个程序。如果全局变量和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用///> DDExtern.h#import NSString *flag = @"DDExtension";@interface ...

weixin_30043999的博客 1498

C/C++ 关键字 const,static,extern

文章目录C/C++ 关键字 const,static,extern1.consta.常量的定义b.修饰函数形参c.修饰类的成员函数d.const 修饰返回值2.statica. 在函数体内b.在模块内,函数体外c.在模块内3.externa.函数的声明中带有externb.extern "C" C/C++ 关键字 const,static,extern 1.const const 字面意思:常量,...

HammerTien的博客 344
上一篇: PHP解析URL并得到URL中的参数
下一篇: spring+springmvc+mybatis+maven
da_ge_da
博客等级 码龄15年 2粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值