C语言之volatile、static、const、extern

【C/C++】类型限定符extern、const、Volatile、register 我们的C语言代码对变量a进行三次赋值后,并没有对a进行调用或后续其他任何操作,系统认为这三句都是无实际意义的,就被优化掉了哈哈哈。(1)①先定义一个普通的整型变量 a,然后分别进行3次赋值。众所周知,前两次赋值会被最后一次赋值覆盖掉,所以前两次的赋值已经无意义了,可以被优化掉。①如下代码,若先定义一个不可变的整型变量a并赋值为10,则再次给a赋新值时,系统会在变量a下面标红,鼠标放在标红处会提示出错原因(如下图)。所以,extern声明有a变量,但不是定义变量a,不会为变量a开辟存储空间。 阅读详情

C语言之volatile、static、const、extern

1.volatile

1.1 volatile基本含义

volatile是一个类型修饰符(type specifier),是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接到内存中读值。
volatile防止代码被编译器优化,例如:

a=1;
a=2;
a=3;

编译器会进行优化,优化为只有a=3(即忽略前三条语句,只产生一条机器代码);如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)
volatile声明的变量是时刻都有可能变的,例如:volatile int a;a*a并不一定是a的平方。

1.2 volatile常见用途

volatile变量的几个例子:

1)并行设备的硬件寄存器(如:状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3)多线程应用中被几个任务共享的变量

1.3 volatile常见提问

1.一个参数既可以是const还可以是volatile吗?
可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2.一个指针可以是volatile 吗?
可以,当一个中服务子程序修该一个指向一个buffer的指针时。

2 static

2.1 static基本含义

static关键字主要用于定义全局静态变量、局部静态变量、静态函数。

2.2 static 全局静态变量

全局静态变量:当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。

2.3 static 局部静态变量

普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别:
1.位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。
2.访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3.值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次再调用该函数,读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。

2.4 static函数

static函数的作用域是本源文件,static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。

参考:https://zhuge.blog.youkuaiyun.com/article/details/76850375

3 const

3.1 const基本含义

const-英文意思-常量,它限定了一个变量时不允许被修改,可以产生静态作用,使用const在一定程度上可以提高程序的安全性和可靠性。

3.2 const 与 #define

预处理指令 #define xxx 可以很方便的进行值替代,这种值替代至少在3个方面有点突出,一是避免意义模糊的数字出现,使得程序语意流畅清晰,二是可以很方便的进行参数的调整与修改,只需要在宏定义那修改,整个程序中所有引用该宏定义的地方都随之更改。三是提高了程序的执行效率,由于是使用“预编译器”进行值替代,并不需要为这些常量存储空间,所以执行效率高。

说道这里,可能会迷惑以上这些内容与const有什么关系呢?

预处理语句虽然有上面说的有点,但是它也有缺点,即预处理语句仅仅只是简单的值替代,缺乏“类型”检测机制,这样预处理语句就不能享受编译系统的类型检查好处了,从而可能成为引发一系列错误的隐患,比如在程序中,定义一个只读变量“u8 name[]=“tom”,在编程中如果对name[1]进行赋值,可能就会引起一系列的错误。

所以,const的推出的初始目的,正是为了取代预编译指令,消除它的缺点,同事继承它的优点。

const作用及优点:

1.以const修饰的常量值,具有不可变性,这是它能取代预定义语句的基础。

2.很明显,它也同样可以避免意义模糊的数字出现,可以很方便的进行参数的调整和修改。

3.C/C++编译器通常不会为const变量分配RAM存储空间,而是将他们保存在符号表中,这就使得它成为了一个编译期间的常量,没有了存储与读内存操作,使得它的效率很高,同时,这也是它取代预定义的重要基础,编译器在编译它时,不会去读存储的内容,而是直接从符号表中替代。这是一种特别特别特别好的优点,比如在存放字库或者图片库时,这些库的对应的数组体积会特别大。

3.3 const常见用途

3.3.1 const常量

由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。

3.3.2 const与指针

const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示:
const int *p1;
int const *p2;
int * const p3;
在最后一种情况下,指针是只读的,也就是 p3 本身的值不能被修改;在前面两种情况下,指针所指向的数据是只读的,也就是 p1、p2 本身的值可以修改(指向不同的数据),但它们指向的数据不能被修改。

当然,指针本身和它指向的数据都有可能是只读的,下面的两种写法能够做到这一点:
const int * const p4;
int const * const p5;
const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

3.3.3 const与函数形参

在C语言中,单独定义 const 变量没有明显的优势,完全可以使用#define命令代替。const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。例如:int strcmp ( const char * str1, const char * str2 );

3.3.4 const 和非 const 类型转换

当一个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2,就有可能发生危险。因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。
const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。
char *指向的数据有读取和写入权限,而const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。

4 extern

4.1 extern含义

extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
extern有两个作用:
第一个,当它与"C"一起连用时,如: extern “C” void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的。
第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义。

4.2 extern 和 static

(1) extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量.
(2) static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面.
static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它. 具体差别首先,static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;其次,static修饰的全局变量声明与定义同时进行,

volatile 和 extern 关键字 volatile 三个特性 易变性:在汇编层⾯反映出来,就是两条语句,下⼀条语句不会直接使⽤上⼀条语句对应的 volatile 变量的寄存器内容,⽽是重新从内存中读取。 不可优化性:volatile 告诉编译器,不要对我这个变量进⾏各种激进的优化,甚⾄将变量直接消除,保证程序员写在代码中的指令,⼀定会被执⾏。 顺序性:能够保证 volatile 变量之间的顺序性,编译器不会进⾏乱序优化。 extern 在 C 语⾔中,修饰符 extern ⽤在变量或者函数的声明前,⽤来说明 “此变量/函数 阅读详情

相关推荐

DMA IP核的详解与实现

在异步时钟下,s_axi_lite_aclk时钟小于m_axi_sg_clk时钟小于m_axi_mm2s_aclk时钟或者m_axi_s2mm_aclk。同步时钟,m_axi_mm2s_aclk、m_axi_s2mm_aclk和m_axi_sg_clk使用相同的时钟源,s_axi_lite_aclk采用较低的时钟源,同步时钟,m_axi_mm2s_aclk、m_axi_s2mm_aclk和m_axi_sg_clk使用相同的时钟源,s_axi_lite_aclk采用较低的时钟源。

wangjie36的博客 9689

C语言关键字详解(五)带你全面了解 volatile 关键字

目录前言一、最易变的关键字—volatile1、volatile 总体阐述2、CPU的运算过程 前言 大家好,欢迎来到C语言深度解析专栏—C语言关键字详解第五篇,在本篇中我们将会介绍C语言当中的另外两个重要的关键字 volatile 和 extern ,相信大家在看完这篇博客后会对 volatile 和 extern 这两个关键字的用法及注意事项有一个系统、全面的认识。 一、最易变的关键字—volatile volatile 是易变的、不稳定的意思。很多人根本就没见过这个关键字,不知道它的存在。也有很

在平淡的日子里寻找存在的价值 1万+

Social-Auto-Upload实战:如何用Python+Playwright实现抖音/B站/小红书一键三连发?

本文详细介绍了如何使用Python和Playwright框架构建Social-Auto-Upload自动化上传工具,实现抖音、B站、小红书等平台的一键多发布。通过模拟真实用户操作和Cookie管理技术,该工具能有效解决内容创作者跨平台发布的重复劳动问题,提升工作效率。

day7的博客 1401

C语言中关键字volatile的含义

volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx。当CPU把其值放到ebx中后就不会再关心对应内存中的值。若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并不会随之更新。为了解决这种情况就创建了volatile限定词,让代码在引

winson_jason的专栏 8126

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1802

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 239

C语言const、static、extern、volatile关键字总结

一、const 关键字总结: 作为一个程序员,我们看到关键字const时,首先想到的应该是:只读。因为,它要求其所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)。看几个例子的中const作用: 1. 修饰常量 用const修饰的变量是不可变的,对const变量赋值:一是在声明时对变量初始化,二是在函数中声明const形参,函数调用时会得到实参的值。以下两种定义形式在本质上是...

心中的日月的博客 5178

STorM BGC V1.31硬件+SimpleBGC固件:从零搭建三轴云台开发环境(Keil+JLink避坑指南)

本文详细介绍了如何从零搭建STorM BGC V1.31硬件+SimpleBGC固件的三轴云台开发环境,涵盖硬件连接、Keil+JLink开发工具配置、固件编译与烧录等关键步骤,并提供了常见问题的解决方案和调试技巧,帮助开发者快速上手三轴云台开发。

weixin_28693683的博客 380

C语言关键字const, static, extern, volatile总结

一、const 关键字总结: 作为一个程序员,我们看到关键字const时,首先想到的应该是:只读。因为,它要求其所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)。看几个例子的中const作用: 1. 修饰常量 用const修饰的变量是不可变的,对const变量赋值:一是在声明时对变量初始化,二是在函数中声明const形参,函数调用时会得到实参的值。以下两种定义形式在本质上是一样的: const int a = 10; int const a = 10; .

fhb1922702569的博客 1587

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8628

【ComfyUI】SDXL + 单LoRA 房屋平面图渲染装修

本文介绍了一种基于ComfyUI的室内平面设计图自动生成效果图的工作流。该流程通过导入房屋平面图,结合SDXL室内设计模型与北欧风格LoRA模块,快速生成多房间效果展示。工作流包含图像输入、文本处理、模型加载和图像生成等环节,支持风格化渲染和细节补充,适用于建筑设计、家装展示、房地产营销等场景。核心采用SDXL通用室内设计模型和北欧极简LoRA,通过节点衔接实现自动化批量生成,能在短时间内将平面方案转化为逼真的三维效果图。该技术可提升设计呈现效率,辅助客户决策,并应用于教学研究领域。

Mr数据杨 3650

C语言中static const extern volatile inline关键字

在 C 语言中,volatile 关键字用于提醒编译器:被修饰的变量可能会被意外修改(如被硬件、中断服务程序等外部因素改变),因此编译器不能对该变量的读写操作进行优化(如缓存到寄存器、重排指令等),必须每次都直接从内存中读取或写入。硬件设备的寄存器(如传感器数据、定时器计数等)的值可能会被硬件自动修改,此时必须用 volatile 修饰,否则编译器可能会优化读取操作(比如只读取一次并缓存到寄存器,忽略后续硬件的修改)。建议而非强制:inline 是对编译器的 “建议”,而非 “命令”。

Zhangh___的博客 1335

2020年大连理工大学《计算机控制技术》期末试卷

2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 ...

无名何许人的博客 648

C语言关键字static、extern、const、volatile 介绍

static作用: 修饰局部变量,改变局部变量生命周期。(具有记忆功能) 下面我们看个例子: (1)变量不加 static 修饰 运行结果如下: (2)变量被 static 修饰 运行结果如下: 总结: 不加static修饰,函数或者代码块中的变量在函数或者代码块执行完毕后就直接回收销毁了,每次执行都会重新分配内存,每次都会销毁。 加 static 修饰,函数或者代码块中的变量在函数或者...

淡然 2307

RK3588 开启多窗口

这样就支持多窗口了。

tzj1058756809的博客 267

pscad IEEE标准系统搭建说明

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

(一)嵌入式C语言总结——const、static、volatile、extern

嵌入式C语言总结——之const、static、volatile、extern关键字

weixin_51353093的博客 2904

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言关键字volatile、static、const、extern详解

告诉编译器,被修饰的变量可能会被意外地修改,编译器不应该对访问该变量的代码进行优化(如将变量缓存到寄存器中),每次访问都要从内存中读取变量的最新值,以确保程序能正确反映变量的真实状态。修饰的局部变量存储在静态存储区,其生命周期从程序开始到结束,不会在函数调用结束后被销毁,且只会初始化一次。修饰的全局变量,其作用域被限制在定义它的源文件内,其他源文件无法访问该变量。修饰的函数,其链接属性变为内部链接,意味着该函数只能在定义它的源文件中被调用,其他源文件不能调用此函数,同样可以减少命名冲突。

2201_75650603的博客 318

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言中的几个关键字介绍(extern、static、const、volatile)

答案肯定是:会导致编译错误或程序行为异常。这是因为关键字和库函数具有特定的含义和功能,而且编译器和链接器都对它们有预定义的行为。当你在程序中定义了与关键字或库函数相同的标识符时,编译器会将其解释为你自己定义的实体,而不是原始意义上的关键字或库函数。这可能导致以下问题:1、 编译错误:如果你在代码中使用与关键字相同的标识符,编译器将无法理解该识符的正确含义,并可能报告语法错误或警告。这样的编译错误可能会妨碍编译过程,导致法成功编译。

分享型博主 1363

C语言——关键字 static volatile const extern 用法

C语言——关键字 static volatile const extern 用法

你要拥有一个你喜欢并且热爱的人生 4780

C语言_volatile、static、register、extern、auto、restrict和const

六种类型修饰符: auto,const,register,static,volatile,extern 1. const 首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修饰的是紧跟着它的那个类型。例如: const int i = 0 ;和 int const i = 0 ; 完全相同 (a) const int *pi = 0;

qq_28090573的博客 1368

C语言中volatile、register、const、static、extern、 auto关键字的作用

一、volatile详解 volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不...

遇见你是我最美丽的意外 1817

C语言中auto,register,static,const,volatile,extern的区别

1)auto   这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 (2)register   这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。  (3)static   常见的两种用途:

蛋蛋强的专栏 5798

C语言修饰符总结,register、const、static、volatile、auto、extern等修饰符

C语言修饰符总结,register、const、static、volatile、auto、extern等修饰符 register 修饰符 register,寄存器变量,告诉编译器它所声明的变量在程序中使用的频率非常高,请编译器尽量将此变量放在寄存器中,这样程序执行速度更快。但实际上编译器不一定这么做,可以忽略此选项。 register 修饰符的几点注意点: 变量必须是 CPU 接受的类型,单个值,...

haoqisongshu的博客 1276

C语言:static,volatile,const,extern,register,auto, 栈stack结构

C语言:static,volatile,const,extern,register,auto

qq_47355554的博客 806

C语言(二):static、extern、const、volatile、typedef、宏与预处理

定义声明严格说不完全对。它是给已有类型起别名,不会真正创造一个全新的底层类型体系。

2301_79911329的博客 436

C语言中关键字auto、static、register、const、volatile、extern的作用

转载自 C语言中关键字auto、static、register、const、volatile、extern的作用 1.auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 int func(){ auto int a; retur...

lvturancao的博客 234
上一篇: 剑指Offer--链表-从尾到头打印链表C
下一篇: C之指针函数和函数指针
ldxFashion
博客等级 码龄6年 0粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值