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

树莓派上基于ONNXRuntime与Qt的C++模型部署实战指南 本文详细介绍了在树莓派上使用ONNXRuntime与Qt进行C++模型部署的完整流程。从环境配置、依赖安装到交叉编译优化,再到Qt界面集成与ARM架构性能调优,提供了实战指南和常见问题解决方案,帮助开发者高效完成边缘设备上的AI应用部署。 阅读详情

关键字auto、static、register、const、volatile、extern
来源:http://www.360doc.com/content/09/0801/22/799_4605817.shtml

这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用:

(1)auto 
  这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

(2)register 
  这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

(3)static 
  常见的两种用途: 
    1>统计函数被调用的次数; 
    2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销. 
  详细说明: 
    1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 
    2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 
    3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

  使用注意: 
    1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 
    2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; 
    3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

(4)const 
  被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。 
  作用: 
    1>修饰输入参数 
      a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。 
      b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。 
    2>用const修饰函数的返回值 
      a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。 
       如对于: const char * GetString(void); 
       如下语句将出现编译错误: 
        char *str = GetString();//cannot convert from 'const char *' to 'char *'; 
       正确的用法是:
       const char *str = GetString(); 
      b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。 
    3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象. 
   说明: 
    const type m; //修饰m为不可改变 
   示例: 
    typedef char * pStr; //新的类型pStr; 
    char string[4] = "abc"; 
    const char *p1 = string; 
    p1++; //正确,上边修饰的是*p1,p1可变 
    const pStr p2 = string; 
    p2++; //错误,上边修饰的是p2,p2不可变,*p2可变 
   同理,const修饰指针时用此原则判断就不会混淆了。 
    const int *value; //*value不可变,value可变 
    int* const value; //value不可变,*value可变 
    const (int *) value; //(int *)是一种type,value不可变,*value可变 
              //逻辑上这样理解,编译不能通过,需要tydef int* NewType; 
    const int* const value;//*value,value都不可变

附:记住const的位置与区别

一个比较经典的问题——问以下两种声明的区别:
1)  const char * p
2)  char * const p

这里的 const 关键字是用于修饰常量,书上说 const 将修饰离它最近的对象,所以,以上两种声明的意思分别应该是:

1)  p 是一个指向常量字符的指针,不变的是 char 的值,即该字符的值在定义时初始化后就不能再改变。
2)  p 是一个指向字符的常量指针,不变的是 p 的值,即该指针不能再指向别的。


(5)volatile 
  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile. 
  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。 
  简单示例: 
   DWORD __stdcall threadFunc(LPVOID signal) 
   { 
     int* intSignal=reinterpret_cast(signal); 
     *intSignal=2; 
     while(*intSignal!=1) 
     sleep(1000); 
     return 0; 
   } 
  该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了: 
     mov ax,signal 
     label: 
     if(ax!=1) 
     goto label 
  对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
label: 
     mov ax,signal 
     if(ax!=1) 
     goto label 
  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

(6)extern 
  extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的,本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的。

static
l           静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。 
l           静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
l           在函数体内生成的静态变量它的值也只能维持

int max_so_far( int curr )//求至今(本次调用)为止最大值

{ 
     static int biggest; //该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期

     if( curr > biggest )

        biggest = curr;

     return biggest; 
}

l           在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。 
l           类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,
                 float SavingsAccount::currentRate = 0.00154;
     (注:currentRate是类SavingsAccount的静态成员变量)
register
l           用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译器有效。http://www.it55.com/

auto
l           它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。 
extern
l           声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。

l           在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:

u         extern “C” 声明语句

u         extern “C” { 声明语句块 }

volatile
l           限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:

int volatile nVint; 
         这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。         只常用于像中断处理程序之类的异步进程进行内存单元访问。

const
const所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。 
l           在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如 
const int maxarray = 255; it55.com 
char store_char[maxarray];    //C++中合法,C中不合法 
l           
const修饰指针时要特别注意。例: 
char *const aptr = mybuf;    // 常量指针
*aptr = 'a';         // Legal
aptr = yourbuf;      // Error
const char *bptr = mybuf;    // (指针bptr)指向常量数据
*bptr = 'a';         // Error
bptr = yourbuf;      // Legal
l           const修饰成员函数时不能用于构造和析构函数。

汉书HE8,好用的汇编代码编写工具 汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大 立即下载

相关推荐

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

【C语言】一次讲清楚auto、static、registe、extern、const、volatile这些存储有关的关键字

`auto`关键字用于声明自动存储变量,它是默认的存储类别。- `static`关键字用于限制变量的作用域或延长变量的生命周期。- `register`关键字指示编译器将变量存储在寄存器中,但现代编译器已经智能地处理这个问题。- `extern`关键字用于声明在其他源文件中定义的全局变量或函数。- `const`关键字用于定义常量,表示其值不能被修改。- `volatile`关键字用于标记变量可能以意外的方式被改变,例如通过硬件或多线程环境中的其他线程。

Goforyouqp的博客 1万+

dummy机械臂代码学习(六)

CLI-Tool文件夹下又包含四个子文件夹,以及一个gitignore文件、一个run_shell.py的python文件、一个run.bat文件和一个zadig exe文件。库解析命令行参数,并根据不同的命令执行相应的操作。Zadig是一个用于Windows操作系统的开源工具,它的主要功能是安装和配置USB驱动程序。的目的呢就是确保在版本控制过程中,不必要的或自动生成的文件被忽略掉,来保持代码仓库的干净和整洁。,DummyStudio的软件作者已放在GitHub,我们主要看CLI-Tool文件夹就行。

jumaohhh的博客 1432

【C语言入门】auto(自动变量)与 static(静态变量)

C语言中的存储类型(Storage Class)决定了变量的内存分配位置、生命周期、作用域和链接属性。本文重点讲解了auto和static两种存储类型。auto变量是默认的存储类型,生命周期与作用域绑定,存储在栈中,适合短期使用的临时变量。static变量则分为静态局部变量和静态全局变量,生命周期为程序级,存储在静态存储区,适合跨调用保留状态或隔离全局变量。静态局部变量仅在函数内可见,而静态全局变量仅在当前文件内可见。通过对比,auto适合临时变量,static适合长期保留状态或隔离全局变量。

Mr_-G,一名勤奋底层软件开发工程师的博客 1786

GibbsCAM软件二次开发:GibbsCAM软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件之间进行通信的接口。在GibbsCAM软件中,API提供了与外部程序交互的能力,使得开发者可以利用GibbsCAM的强大功能进行二次开发,定制化满足特定的制造需求。GibbsCAM的API主要基于.NET框架,使用C#或VB.NET等语言进行编程。在GibbsCAM软件中,通过API接口创建自定义几何形状是实现复杂零件设计和加工策略定制的关键步骤。

kkchenjj的博客 1497

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

auto、static的用法

而static修饰全局变量时,这个全局变量的外部链接属性变为内部链接属性,是其他源文件(.c)文件就可以再使用这个全局变量了。使用std::vector::iterator来定义i是C++常用的良好的习惯,但是这样长的声明带来了代码可读性的困难,因此引入auto,使代码可读性增加。static修饰局部变量时,会影响局部变量的生命周期,本质上改变了局部变量的存储位置,生命周期变长,为整个周期。既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1。

m0_66338176的博客 501

华为OD机试真题 C 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

C中的auto、static、register、extern、const和volitate

register变量:一般变量的值都是存储在内存中,(当程序需要用到哪一个变量的值,由控制器发出指令将内存中该变量的值送到运算器,完了如果需要存数,再从运算器将数据送到内存中存放。具体包括四种:自动的(auto),静态的(static),寄存器的(register)和外部的(extern)。static声明变量:用static声明的静态局部变量,在函数调用结束后不消失,反而保留当前的数据,在下一次该函数调用时,该变量现有的值就是上一次函数调用结束时的值。作用域为从变量的定义处开始,到本程序文件的结尾。

m0_70888041的博客 1437

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码)

微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意,

🏆 前端领域优质创作者 1万+

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4704

C:存储类 auto、static【隐藏(局部变量)、内容持久(静态存储区的变量只初始化一次)】、extern【引用、共享】、C跨文件调用变量、生命周期

2、

long_steve的博客 644

提示词编写:从新手到专家的进阶之路

本文旨在为提示词编写者提供一条从新手到专家的进阶之路。我们将详细探讨提示词编写的背景与意义、基础与进阶技巧、实战应用以及最佳实践。通过逐步深入的分析与实操,读者将掌握提示词编写的核心要点,提高编写效率和作品质量。提示词是用于引导人工智能生成文本的关键词或短语,它包含了作者想要传达的主题、情感和细节。随着人工智能技术的普及,自动化写作工具逐渐应用于各行各业。为了提高写作效率,项目团队决定开发一款基于人工智能的自动化写作工具。成功开发了一款自动化写作工具,生成文本质量较高。

AI天才研究院 1087

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

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

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

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

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

关键字const、static、extern、register、volatile、auto的作用

weixin_50964793的博客 921

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

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

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

关键字auto、static、register、const、volatile、extern 这些关键字是C语言中常见的也是是c++的基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto    这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就

caoyouming0609的博客 535

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

简单介绍C语言中auto,register,static,const,volatile,extern等几个关键字的作用

C语言中auto,register,static,const,volatile,extern等几个关键字的作用

slience_J的博客 1189

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

1.auto这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 intfunc(){autointa;return 1;}autoint b = 22;int main(int argc, char const *argv[]){printf("%d\n...

weixin_32698563的博客 606

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

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

jacky的博客 883
上一篇: cancelling 'com.example.myfirstapp.mainactivity activity launch'
下一篇: ARC (Automatic Reference Counting)
free菠菜
博客等级 码龄18年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值