C/C++ 全局变量初始化

2023-10-29

C语言全局变量只能用常量表达式初始化,不能用一个数学函数或者其他的需要在运行时才能计算出结果的表达式进行初始化。

C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):

  • static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 const initialization,静态初始化在程序加载的过程中完成,对简单类型(内建类型,POD等)来说,从具体实现上看,zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。

  • dynamic initialization:动态初始化主要是指需要经过函数调用才能完成的初始化,比如说:int a = foo(),或者是复杂类型(类)的初始化(需要调用构造函数)等。这些变量的初始化会在 main 函数执行前由运行时调用相应的代码从而得以进行(函数内的 static 变量除外)。

需要明确的是:静态初始化执行先于动态初始化! 只有当所有静态初始化执行完毕,动态初始化才会执行。显然,这样的设计是很直观的,能静态初始化的变量,它的初始值都是在编译时就能确定,因此可以直接 hard code 到生成的代码里,而动态初始化需要在运行时执行相应的动作才能进行,因此,静态初始化先于动态初始化是必然的。

对于出现在同一个编译单元内的全局变量来说,它们初始化的顺序与他们声明的顺序是一致的(销毁的顺序则反过来),而对于不同编译单元间的全局变量,c++ 标准并没有明确规定它们之间的初始化(销毁)顺序应该怎样,因此实现上完全由编译器自己决定,一个比较普遍的认识是:不同编译单元间的全局变量的初始化顺序是不固定的,哪怕对同一个编译器,同一份代码来说,任意两次编译的结果都有可能不一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 全局变量初始化 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • Burst(突发)信号详解

    突发信号是一个根据字面意思非常难以理解的信号 为此头疼了好久 终于理解了什么是突发信号 突发是指在同一行中相邻的存储单元连续进行数据传输的方式 连续传输所涉及到存储单元 列 的数量就是突发长度 SDRAM 简称BL burst length
  • EQ均衡器原理

    做音乐最离不开的效果器是什么 相信大多数朋友都会回答 是EQ 不错 正是有了这个所谓 均衡 的效果器 我们的音乐才不会过载 乐器音色才会如此丰富 然而知道1加1等于2更要知道1加1为什么等于2 今天我把这个效果器扒光 从根本上来分析它的工作
  • my-innodb-heavy-4G.cnf配置文件详解

    client 客户端 port 3306 客户端连接端口 socket tmp mysql sock 客户端套接字文件的路径 mysqld port 3306 服务器监听端口 socket tmp mysql sock 服务器套接字文件的路
  • 做自动化测试可选择的工具有哪些?

    如今 作为一名软件测试工程师 几乎所有人都需要具备自动化测试相关的知识 并且懂得如何去利用工具 来为企业减少时间成本和错误成本 这是为什么呢 在以前 会测试人员一般都只需要扮演终端用户 会做手动测试用例并记录观察结果就足够了 但如今 一旦你
  • QT中connect函数中的lambda表达式关于局部变量的按值拷贝与按引用拷贝,以及mutable关键字

    1 当lambda表达式中使用 时 为按值拷贝作用范围的局部变量 默认不可修改按值传进来的拷贝 如图 不加mutable时报错 a不可改变 加mutable后可以改变a值 但是时修改的拷贝对象 connect上边的a值未修改 include
  • Spring Boot 3.0 (十四): Spring Boot 整合 Shiro安全框架

    官方暂时还没有适配 Spring Boot 3 X 这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro 安全应该是互联网公司的一道生命线 几乎任何的公司都会涉及到这方面的需求 在 Java 领域一般有 Spr
  • wxc-progress使用

  • docker 安装gitlab

    https www cnblogs com zuxing articles 9329152 html
  • C语言中输出string方法c_str()用法

    今天突然用printf s str str 是一个string 的时候突然出现乱码 就查了一下为什么 任何时候只有自己敲代码的时候才能发现 可以用cout lt
  • 智慧节能照明系统的八大应用场景

    节能 作为社会经济发展的主旋律 在生产生活的方面都要积极实践 照明是首当其冲需要进行节能升级的 智慧节能照明系统解决方案 基于电力网络 以物联网 自动化控制 无线通讯等技术 结合智能化物联网设备 实现对照明系统的集中 定时 模式等多样化控制
  • xcode编译代码的时候 ld: library not found for -xxx 解决方法

    有时候在Xcode下面我们需要引入第三方类库 或者自己写的静态库 如果配置不正确 就会出现如下错误 ld library not found for lpcre clang error linker command failed with
  • Redis:实现全局唯一ID

    Redis 实现全局唯一ID 一 概述 二 实现 1 获取初始时间戳 2 生成全局ID 三 测试 为什么可以实现全局唯一 其他唯一ID策略 补充 countDownLatch 一 概述 全局ID生成器 是一种在 分布式系统下 用来生成全局唯
  • 来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

    大家好 我是学生大使 Jambo 在我们前一篇文章中 我们介绍了 OpenAI 模型的调用 今天 我将为大家介绍 Embedding 的使用 嵌入是什么 嵌入 Embedding 是一种将高维数据映射到低维空间的方法 嵌入可以将高维数据可视
  • HTTP介绍:一文了解什么是HTTP

    前言 在当今数字时代 互联网已经成为人们生活中不可或缺的一部分 无论是浏览网页 发送电子邮件还是在线购物 我们都离不开超文本传输协议 HTTP HTTP作为一种通信协议 扮演着连接客户端和服务器的重要角色 它不仅仅是一种简单的传输协议 更是
  • OSS/J即将获得飞速发展

    软件集成已经是运营商不得不面对的大问题了 数目众多的独立软件公司所提供的应用程序接口互不兼容所引发的互通性问题正使运营商焦头烂额 这也就是为什么基于Java技术的OSS OSS J 正在越来越得到重视的原因 OSS J推出的初衷是源于企业采
  • iostat 命令查看io信息

    在使用htop命令的时候会看到这么一行 翻译一下 us 用户态使用的cpu时间比 sy 系统态使用的cpu时间比 ni 用做nice加权的进程分配的用户态cpu时间比 id 空闲的cpu时间比 wa cpu等待磁盘写入完成时间 hi 硬中断
  • 大厂年薪30W+数据分析师学习路线,实用到哭!会Python的更有优势!

    不知道大家发现没 近几年 国内对数据分析类人才需求越来越大了 这点从国家开始批准大学设立数据分析相关专业就能看出来 2016年2月 教育部公布新增 数据科学与大数据技术 专业 北京大学 对外经济贸易大学 中南大学成为首家获批高校 后来又有中
  • 常用Shell命令汇总-vim

    不知道大家平时有没有跟我一样的感受 就是很多shell命令自己其实用过 但时间一久又忘记了 导致又要到处百度 开始写这个系列的目的第一是为了总结 第二是为了以后忘记时可以直接到这找哈哈哈哈哈 平时在百度时还发现一个问题 就是其实我只想要最常
  • 怎么看服务器的token信息,token查看

    token查看 内容精选 换一换 本章节通过示例演示如何调用API来删除负载均衡器 删除负载均衡器时 需要逐个删除负载均衡器下的资源 负载均衡器关联的资源如图1 包括监听器 转发策略 后端服务器组 健康检查和后端服务器 当您使用Token认
  • C/C++ 全局变量初始化

    C语言全局变量只能用常量表达式初始化 不能用一个数学函数或者其他的需要在运行时才能计算出结果的表达式进行初始化 C 标准 全局变量的初始化要在 main 函数执行前完成 常识无疑 但是这个说法有点含糊 main 函数执行前到底具体是什么时候