全局变量初始化顺序及注意事项

IAR开发实战:巧用链接器指令,将C语言全局变量精准定位到特定RAM区域 本文详细介绍了在IAR开发环境中如何利用链接器指令将C语言全局变量精准定位到特定RAM区域,以优化嵌入式系统性能。通过实战案例和代码示例,展示了DTCM和SRAM的配置技巧,以及如何避免常见的内存布局问题,帮助开发者提升关键代码的执行效率。 阅读详情
   对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。
       此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。所以,尽量不用全局变量;用静态变量,通过访问器进行访问。
 
例如:全局变量  
        int   a   =   5;  
        int   b   =   a;  
       如果a和b定义在同一个文件里,那没什么问题,结果b等于5;如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化。
       事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如  
  int   get_a()  
  {  
          static   int   a   =   5;  
          return   a;  
  }  
  int   get_b()  
  {  
          static   int   b   =   get_a();  
          return   b;  
  }   
    
       这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。 
       任何时候,如果在不同的被编译单元中定义了"非局部静态对象",并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题.你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序。对于函数中的静态对象(即"局部"静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化..  
       PS:千万不要写出和编译顺序相关的程序来。 
 
       关于全局变量的初始化,C语言和C++是有区别的。      
       在C语言中,只能用常数对全局变量进行初始化,否则编译器会报错。       
       在C++中,如果在一个文件中定义了int a = 5;要在另一个文件中定义int b = a;的话,前面必须对a进行声明:extern   int   a;否则编译不通过。即使是这样,int b = a;这句话也是分两步进行的:在编译阶段,编译器把b当作是未初始化数据而将它初始化为0;在执行阶段,在main被执行前有一个全局对象的构造过程,int b = a;被当作是int型对象b的拷贝初始化构造来执行。    
      其实,准确地说,在C++中全局对象、变量的初始化是独立的,如果不是象int a   =   5;这样的已初始化数据,那么就是象b这样的未初始化数据。    
      而C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。
 
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化 阅读详情

相关推荐

编译链接实战(16)常见编译器内置属性修饰符

请记住,全局变量的初始化顺序是依赖于编译器和链接器的具体实现的,可能在不同的编译器和平台上有所不同。需要注意的是,初始化函数的优先级仅用于确定它们的执行顺序,并不表示初始化的速度。默认情况下,没有指定优先级的初始化函数被视为具有中等优先级(0),而通过显式设置优先级,可以控制初始化函数的执行顺序。特性为开发者提供了一种方便的方式来定义在程序启动时自动执行的初始化函数,使得全局的初始化工作变得更加简单和方便。是GCC和兼容的编译器中的一个特性,用于指示编译器将一个函数标记为在程序启动时自动执行的初始化函数。

二进制君 2516

C++面经:初始化全局变量和未初始化全局变量有什么区别

全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。(1).全局变量区和静态变量区的存储是返回在一块的,初始化的全局变量和静态变量在一块区域。未初始化的全局变量和未初始化的静态变量在相邻的另一区域。注意:未初始化的全局变量的默认值是 0,而未初始化的局部变量的值却是垃圾值(任意值)。注意:这里的堆区不同于数据结构的堆,堆区的分配方式倒是和数据结构的链表比较相似。注意:静态区的内存在程序结束后由系统释放。

qq_70799748的博客 1737

DCM、PLL以及DLL等概念及详情

介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。

CLL_caicai的博客 8338

C++ 变量初始化顺序

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

lin的博客 3509

Zephyr RTOS线程间通讯实战:消息队列与信号量的5个经典应用场景

本文深入探讨了Zephyr RTOS中线程间通讯的核心机制,通过消息队列与信号量的组合,详细解析了传感器数据处理流水线、命令分发系统、日志记录、资源池管理以及周期性任务协同调度等5个经典应用场景。这些实战模式为构建高效、稳定且可维护的嵌入式多线程系统提供了清晰的设计蓝图和代码范例。

tomato的博客 94

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 508

C\C++编程技巧之全局变量的初始化

考虑到如果第一次变量dis就是0的话,该动作并不会执行。故需要在上电初始化的时候,将该值设置为不相等,不要将dis_old值置为某一个特定的值,不然会出现特定的bug。

qq_28116937的博客 834

5、Visual Studio Code:强大的编码与文件管理功能

本文详细介绍了 Visual Studio Code 的强大编码与文件管理功能,涵盖代码导航、引用查找、符号重命名、实时代码分析、IntelliCode 提示、文件和文件夹操作等内容。通过功能对比、流程图和实际开发案例,展示了 VS Code 如何提升开发效率和代码质量,适用于各类编程语言和项目开发场景。

water的专栏 133

【转】浅谈编译器优化

“memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。 1、编译器优化介绍 内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,...

系统运维 456

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1640

智能门禁:AI Agent的访客意图识别

随着人工智能技术的飞速发展,智能门禁系统已经成为现代安全管理的关键环节。本文深入探讨了AI Agent在访客意图识别中的应用,通过详细的分析和实例讲解,揭示了智能门禁系统的核心工作原理、算法实现及其在安全领域的重要作用。文章结构清晰,逻辑严谨,旨在为广大技术爱好者提供一次全面的技术盛宴。在当今社会,门禁系统已成为各类建筑和机构不可或缺的安全设施。随着信息安全意识的增强,传统门禁系统的局限性逐渐显现。例如,在访客管理方面,传统方法通常依赖于人工登记、身份验证等手段,不仅效率低下,而且容易出现漏洞。

AI架构师小马 708

关于动态链接中的全局变量

《程序员自我修养》观后验证第二弹。 第一个例子: 有三个程序: main.cpp #include int global_symbol = 300; extern void testso1(); extern void testso2(); int main() { global_symbol++; printf("the value of global s

gerryke的blog 1181

华为MetaERP国资委语境下的 DRP(全域数字化资源管理平台/Digitalized Resource-management Platform)与传统 ERP(以 SAP、Oracle 为代表)的

【摘要】国资委推动的DRP(全域数字化资源管理平台)正在重构央国企数智化转型路径,其本质是通过"ERP管交易+DRP管管控"的双层架构实现升维替代。与传统ERP相比,DRP具有三大突破:采用国产分布式数据库实现全级次穿透监管、构建数据中台打破信息孤岛、以实时分析替代事后报表。当前政策明确2026-2030年分阶段建设目标,这将重塑产业格局——倒逼传统ERP厂商转型,为云原生/AI/信创企业创造新机遇。需注意DRP并非简单替代ERP,而是通过治理模式变革实现"交易系统做薄、管控中

金牌架构师 286

2_2、全局变量创建与使用

在C++项目中定义全局变量有三种常见方法:1)通过头文件声明+源文件定义(使用extern关键字);2)使用单例模式确保唯一实例并提供全局访问点;3)注意事项包括线程安全(加互斥锁)、命名冲突(使用命名空间)和初始化顺序问题。前两种方法分别适合简单变量和复杂全局对象,第三种方法强调多线程环境下的安全性。

qingttqing的博客 595

提升YOLOv8性能:用Swin Transformer替换Backbone的详细实现与分析【YOLOv8】

YOLOv8作为目标检测领域的最新版本,在速度和精度之间取得了良好的平衡。然而,随着计算机视觉任务的复杂性不断增加,YOLOv8的标准主干网络(Backbone)在处理高分辨率图像或多尺度目标时,可能存在一定的局限性。为了进一步提升YOLOv8的性能,我们可以引入Swin Transformer替换其主干网络,以增强模型的全局感知能力和多尺度特征提取能力。本文将详细介绍如何在YOLOv8中用Swin Transformer替换原有的Backbone,提供代码示例,并深入探讨其中的原理和效果。

博客 1717

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

定义全局变量 —— python & C

出发点 我希望能将配置变量全都声明在一个文件中,这样主要程序代码的文件就不会很紊乱(很多全局变量要放在所有函数外面,也就是文件最前面定义) C 在一个cpp中声明,在另一个文件中使用extern声明,然后就可以直接调用了 但是这样,并不能解决主文件很乱的问题 另一方面,轮子哥也不建议这么做(如果多文件的话,很多人会倾向于在头文件中及逆行extern声明,然后包含头文件吧) 推荐的方法就...

Hesy_H的博客 736

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32——代码开发顺序

STM32——代码配置顺序

君鼎的博客 1055

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

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qt中数据共享

Qt中数据共享

ganhui13000的博客 735

6. golang之init函数

1. 基本介绍 每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用。 案例说明: package main import ( "fmt" ) // init函数,通常可以在init函数中完成初始化工作 func init() { fmt.Println("init() ...") } func main() { fmt.Println("main() ...") } 输出结果是: 2. init函数的注

weixin_43893483的博客 386

static使用注意事项

static的核心作用是。

2301_81470485的博客 190

OC中的load和initialize方法

OC中有两个特殊的类方法,分别是load和initialize。本文总结一下这两个方法的区别于联系、使用场景和注意事项。Demo可以在我的Github上找到——load和initialize,如果觉得有帮助还望点个star以示支持,总结在文章末尾。 load 顾名思义,load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否

lijiexiaoge的博客 400

C语言数据结构拦路虎-遇到的问题

问题一、描述:在创建顺序栈时,在stack.c定义一个函数用于创建顺序栈,把栈置空,在添加一个元素进栈 //创建一个栈 seqstack * Creat_stack() { seqstack s,*p; //创建一个栈 p=&s; p->top=-1; return p; } 在main.c里主函数调用,创建一个栈,Push函数将3进栈 #include<st...

f的博客 389

c语言中不同的存储类型所对应的段

再看这篇博文之前可以先看下我另一篇博文:linux内存映像分配 参考: 1.C语言 子函数return局部变量和栈地址 机制 2.嵌入式linux C语言程序设计(书) 3.什么是内部链接和外部链接,什么是空链接 下面的程序已运行的情况说明: #define <stdio.h> #define SUM hello //字符串常量"hello"保存在.rodata段 [extern] ...

u013581207的博客 350

Go语言 init函数详解

你好,我今天想跟你聊聊 Go语言里面一个很有趣、很重要的小机制 —— init函数。 init虽然平时用得不多,但每次用到,它都是救场王。 我尽量用很自然的方式告诉你,到底`init`是干什么的,它的规则又是什么。

gopher123的博客 1644

using namespace std 不识别_一篇文章带你了解 C++ 的门门道道,不知道的快点看过来...

C++是一门被广泛使用的系统级编程语言,更是高性能后端标准开发语言;C++虽功能强大,灵活巧妙,但却属于易学难精的专家型语言,不仅新手难以驾驭,就是老司机也容易掉进各种陷阱。本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍;对一些常见的误解,做了解释澄清;对比较容易犯错的地方,做了归纳总结;希望借此能增进大家对C++语言了解,减少编程出错,提升工作效率。一、我的程序里用了...

weixin_39777637的博客 595

谈一谈 Android Application 的理解

Application的理解,作用,初始化原理等。

Lud的博客 1212
上一篇: C语言动态数组
下一篇: C语言中全局变量初始化的重要性!!!
macrohasdefined
博客等级 码龄15年 44粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值