水滴石穿C语言之static辨析

嵌入式系统中的无符号16位整数(uint16_t) 如果需要表示更大的数值,就需要使用更大的数据类型,例如uint32_t或uint64_t。在本文中,我们将探讨uint16_t的用途以及如何在嵌入式系统中使用它。uint16_t是嵌入式系统中常用的数据类型之一,用于表示范围在0到65535之间的无符号整数。然而,需要注意的是,uint16_t有其限制,包括无法表示负数和较小的数值范围。由于uint16_t只占用16位,相比使用32位的整数类型,它可以减少一半的内存消耗。由于uint16_t的大小较小,它可以更快地加载到处理器的寄存器中,并进行计算操作。 阅读详情

  1、概述

  static 声明的变量在C语言中有两方面的特征:

  1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

 
 
  2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

  2、问题:Static的理解

  关于static变量,请选择下面所有说法正确的内容:

  A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

  B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

  C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

  D、静态全局变量过大,可那会导致堆栈溢出。

  答案与分析:

  对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。

  对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。

  对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。

  因此,答案是A、B、C。

  3、问题:不可重入函数

  曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?

unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum = 0; // 注意,是static类型的。
 for (index = 1; index <= base; index++)
 {
  sum += index;
 }
 return sum;
}

  答案与分析:

  所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

  这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

  将上面的函数修改为可重入的函数很简单,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto 类型的变量,函数即变为一个可重入的函数。

  当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

ABB机器人C#二次开发实战:从通信打通到数据读写的落地指南(附完整工程) 最近在做自动化产线升级项目时,遇到一个核心需求:用C#上位机实时读取ABB机器人的关节角度、IO信号,同时下发运动指令和参数配置。翻遍全网,要么是Robot Studio的基础操作教程,要么是C++/VC++的老旧案例,C#相关的实操内容要么只给片段代码,要么跳过通信配置、权限设置等关键步骤,导致刚上手时踩了无数坑——连接超时、数据读不到、写入无响应,甚至误触发机器人安全保护。 阅读详情

相关推荐

归因分析计算因子贡献度常见的方法

在归因分析中,我们一般都需要计算出每个因子的贡献度是多少,比如产品DAU上升,对年龄段维度进行拆解,看是不同年龄段的用户对DAU上升的贡献度是多少,一般根据指标的类型,计算贡献度的方法也不一样,下面就列出一些常见的归因分析贡献度的计算方法。

Hubans的博客 4万+

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了

uint8_t / uint16_t / uint32_t /uint64_t  是什么数据类型 在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么

kiddy19850221的专栏 37万+

COLMAP在Ubuntu下的编译陷阱与实战避坑指南——从环境配置到三维重建全流程

本文详细介绍了在Ubuntu系统下编译和配置COLMAP三维重建工具的全流程,包括环境准备、依赖库安装、CUDA加速配置以及常见编译问题的解决方案。通过实战案例演示了从图像特征提取到稠密重建的完整步骤,并提供了性能优化和问题排查的实用技巧,帮助用户高效完成三维重建任务。

weixin_29003437的博客 1048

性能小钢炮-注册技术-轰轰烈烈干一场

天下武功 其实都阅兵 注册技术 其实timer模块的码云我已经写了V1.0 V2.0 前面的那个SDK用的是数组!!我觉得可以统一下 用链表!! 统一:定时器周期执行一次函数----定时器执行LED-BEEP-RELAY这样---挂接ID-FUNCTION这样的函数注册 开始吧: 最开始是模块 链表的数据结构 一个一个的节点!上面的区别就是节点 是不一样的结构体 下面就是以前的tim...

GKoSon的博客 275

智能车小白也能懂:手把手教你用LM358和工字电感搭建电磁循迹模块(附PCB设计避坑)

本文详细介绍了如何利用LM358运放和工字电感搭建智能车电磁循迹模块,从电感选型、电路设计到PCB布局和焊接调试,提供全流程实战指南。特别针对新手常见问题,如信号干扰、电路饱和等,给出具体解决方案和参数配置,帮助智能车比赛爱好者快速掌握电磁循迹技术。

weixin_30307921的博客 401

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 779

uint16_t

uint16_t 是一种数据类型,它表示无符号 16 位整数。这种类型的整数值的范围是 0 到 65535,即最多可以表示 2^16 个不同的数字。uint16_t 类型的整数占用 2 个字节的内存空间。在 C 和 C++ 程序中,可以使用 uint16_t 类型来定义无符号 16 位整数变量。例如: uint16_t num= 65535; 在其他编程语言中,也可能会提供类似的无符号 16 位...

weixin_35754962的博客 9304

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2155

系统调用的实现

问题 系统中的所有任务都是一直不停执行吗?任务入口函数结束后,返回到哪里? 再论当前任务执行解决方案 我们是通过修改 eip 寄存器的值来实现任务跳转的。 结论 当前方案直接通过 iret 跳转到进程入口函数执行,并非函数调用,因此无法正确返回!!! 改进思路 Task 结构体中新增 void (*tmain)() 成员 (保存任务入口函数地址) 新增 void TaskEntry() 全局任务入口函数 (RegValue.eip = (uint)TaskEntry;) .

qq_52484093的博客 281

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 724

Zephyr RTOS详解

Zephyr 是一个开源的实时操作系统(RTOS),专为资源受限的嵌入式设备设计,支持多种架构(如 ARM Cortex-M、RISC-V、x86 等)。

weixin_43484713的博客 4106

水滴石穿C语言之extern声明辨析

  1、概述  static 声明的变量在C语言中有两方面的特征:  1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。    2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。  2、问题:Static的理解  关于static变量,请选择下面所有说法正确的内容:  A、若全局变

小发猫 1834

Linux iperf 进行跑流测试时,为啥单条流会有速率上不去的问题?

iperf

1042484520@qq.com(邮箱) 3086

为什么优秀的嵌入式工程师都懂static全局变量?真相令人震惊

掌握C语言static关键字全局变量用法,可有效控制变量作用域与生命周期。适用于嵌入式开发中模块化设计,避免命名冲突,提升代码安全性与维护性。详解其在多文件项目中的应用技巧,值得收藏。

FastSolve的博客 716

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

单片机c语言数码管程序,单片机C语言static属性和数码管显示程序

static从英文上翻译是静态的意思,在C语言中static所起的作用也正是静态。对于局部变量而言,其作用域是局部的如某一子函数体,程序在每次执行时调用该子函数时,其声明的局部变量都会重新赋值。那如果我们想让程序在调用该子函数时,其声明的某个局部变量的值,保留上次该子函数被调用结束时的值,那么就需要在变量声明时前置static。可以这么理解,对于静态的局部变量,其占用的内存空间在程序执行时是一直都...

weixin_42157567的博客 579

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

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

为啥要有静态的成员函数(static修饰的成员函数)

原因就是普通的成员函数形参里是隐含了this指针的也就是说需要传this指针,而this指针指的是你创建好的对象的地址,你访问的时候都没告诉它我的this指针指向谁,就只给了类域在哪,所以形参就少传了一个参数。一般我们想要使用类里面的成员函数都要创建好对象之后才能使用,如下图所示,A是我们创建好的类,Getn()是他的成员函数。正是因为不需要传this指针,所以我们在使用的时候,就不需要去创建对象去使用,而直接指定好类域就好了。所以加上static,访问的时候就不需要传this指针,直接给类域就好了。

2301_78477221的博客 433

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

为什么要用static

本文主要介绍C/C++中的static,以及为什么要用static,别人的代码中有时会突然使用用static,看的一脸蒙圈,为什么要用static,我不用难道不行吗?对啊为什么呢?

m0_71489826的博客 1794

【C语言】详解静态变量static

详解静态变量static

m0_73367097的博客 6456

c语言中的static关键字

总结一下const,static,extern这三个关键字的用法

w117的博客 494

c语言出识

目录 <1>.关键字typedef <2>.关键字static <3>.#define <4>.指针 <5>.结构体 1.typedef typedef 顾名思义是类型定义,这里应该理解为类型重命名 简单地说就是将数据类型名称改成自己想用的名字 代码: #include<stdio.h> typedef unsigned int u_int; //将unsigned int 重命名为u_int, 所以u_int..

weixin_62877993的博客 808

C杂碎

在Linux下输出long long类型。 printf("%lld", l);

qc_liu的blog 684

static unsigned short,int ,char

static unsigned short,int ,char 1.static unsigned short,int ,char 表示静态变量,静态变量只会存在一个内存空间,不管什么时候对其改变都会影响下一次执行的结果。而且其值可以被不断的改变,但如果加了const则不会被改变。static unsigned const int表示不可改变的变量 2.static 类型名 函数名(形参表) 例如 static int fun(int a,int b) 表示一个内部函数,又称静态函数,可以使用函数的作用域只

yiweiwei516的博客 1981

初识C语言——static用法详解

static 是C语⾔中的关键字。static 是 静态的 的意思,可以⽤来:• 修饰局部变量• 修饰全局变量• 修饰函数static修饰局部变量改变了变量的⽣命周期,但是作⽤域不变的;static修饰全局变量会使全局变量的外部链接属性变成内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤;static修饰函数,使得函数只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。

m2668465307的博客 3272

C语言中定义变量的技巧(全局变量、局部变量、静态全局变量、静态局部变量)

A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中

Tony铖 的专栏 1997
上一篇: Windows下C语言网络编程快速入门
下一篇: 水滴石穿C语言之extern声明辨析
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值