c/c++中extern、static、const的用法及全局变量/常量

c/c++中extern、static、const的用法及全局变量/常量基本概念编译单由 cpp c 文件及 include 的 h 文件构成一个编译单 把头文件内容复制到 cpp 中 在编译时 编译为一个 obj 文件 obj 文件里包含了变量存储的相对地址

基本概念

  1. 编译单
    由.cpp(.c)文件及include的.h文件构成一个编译单(把头文件内容复制到cpp中),在编译时,编译为一个.obj文件,obj文件里包含了变量存储的相对地址。
  2. 声明与定义
    函数或变量在声明时,并没有分配实际物理内存空间;当函数或变量定义时会分配物理内存空间,并有相应的地址。

extern、static、const

  1. extern
    extern 有两个作用:
    当extern与“c”在一起使用时,如:extern “C” void fun(int a,int b)则告诉编译器fun这个函数名时按着c的规则去翻译相应的函数名而不是c++的,c++的规则在翻译这个函数名时,会把fun更改为?fun@CDataView@@QAEXHH@Z类似这样的名字。在生成dll提供给外部调用时尤其要注意,例如C#通过Import调用非托管代码时需要匹配函数名。

c++规则编译的函数名:
c++规则编译的函数名
extern c规则编译的函数名:
extern c规则编译的函数名

当extern 不与“c”一起修饰变量或函数时,其作用就是声明函数或变量的作用范围。extern的作用范围为本模块或其他模块。extern是一个声明不是定义

//test.h //声明全局变量,一个程序中可以不声明或任意次声明,声明是为了告诉当前编译单去寻找此全局变量 extern char[] g_username; //test.cpp //定义全局变量 #include "test.h" char[] g_username="admin";
  1. static
    static 和 extern “水火不容”,static和extern不能同时修饰一个变量!
    static 修饰的全局变量声明与定义同时进行,声明后就同时被定义了。
    static 修饰的全局变量的作用域只是本身的编译单(.cpp)内,其他编译单看不到它,所以一般定义static全局变量时都是放在cpp中而不是头文件,这样不会给其他模块造成不必要的污染。

对于第三点,static的作用域可能大家不理解,一下用代码来验证一下:

//test1.h //分别用数值和指针进行验证 #include <iostream>  using namespace std; static int flg=2; static char name[]="admin"; void fun1();
//test1.cpp #include "test1.h" void fun1() { flg=5; cout<<"test1 flg value:"<<flg<<endl; name[0]='c'; cout<<"test1 name value:"<<name<<endl; } 
//test2.cpp #include "test1.cpp" void fun2() { cout<<"test2 flg value:"<<flg<<endl; cout<<"test2 name value:"<<name<<endl; } void main() { fun1(); fun2(); }

结果:
这里写图片描述

类中静态成员初始化问题
参考static成员必须在类外初始化
在一次使用单例模式时,类中需要有一个当前类的静态对象,且有默认空的值,若像局部静态变量声明同时定义则会报错
Error: 带有类内初始值设定项的成员必须为常量
为什么不能在类内初始化???下次再仔细分析
先看如何在类外初始化,上代码:

//单例 class CConfigSetting { private: CConfigSetting(); ~CConfigSetting(); //类内声明 static CConfigSetting* m_cfgSetting; public: sDbCfg dbSetting; //数据库连接设置 int port; //端口号 sTimerCfg timerSetting; //定时器设置 static CConfigSetting CreateInstance(); void Save(); }; //类外初始化 CConfigSetting* CConfigSetting::m_cfgSetting = nullptr;

  
  
3. const
const 是常量
在头文件(被多次include)中定义const char g_str[]=”admin”不会报错,但是const char * g_str=”admin”会报错。
const char g_str[]=”admin”与static const char * g_str=”admin”、const char* const g_srt=”admin”效果一样,都不可被修改。
const char * g_str=”admin” 可被修改:g_str=”ccc”;

今天的文章 c/c++中extern、static、const的用法及全局变量/常量分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-06 18:46
下一篇 2025-01-06 18:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/103233.html