关于全局变量,static,define和const
其实按照现在主流的观点,应该尽量少用全局变量和define,尽量多用临时变量,并且用const替换值define,用短小精悍的函数替换函数define。
对这些我倒是也没有什么意见,只是觉得有些东西存在就是存在,也是非常有道理的。比如define好了,虽然没有类型检查,也很难插错,连搜索reference都找不到东西在哪里。
但是它对系统没有性能消耗,C语言又没有inline函数,也没有lambda表达式。如果不用define的话,函数就一定会有调用开销,这种开销看上去似乎没多少,但是在嵌入式系统中,毕竟是能省则省的。而且define的函数写得相当紧凑,十几个内联函数用define一写就是非常漂亮的十几行,换成普通函数调用那个体量简直让人不想再看。
不过总的来说还是尽量写函数吧,哪怕用函数验证之后再改成define也好,能让编译器帮忙插错的就让编译器查,不要手动去弄。
反过来,函数定义define虽然有可取,但是值define我就非常费解了……已经有了const为什么还要用define来定义值呢?完全可以const全大写代替define嘛,而且还有类型检查,万一赋值出错编译器就帮你解决问题了。况且const变量在机器中的储存位置也不是RAM,不会消耗单片机少得可怜的内存空间。干嘛不用呢。
很多书都在说"全局变量是魔鬼",但是我觉得这也要分开来看的。普通的全局变量,在一个文件里定义之后,链接时会整个程序有效,这种全局变量的确让人很不放心,即便要用也应该限定其在同一个C文件中定义。而加上static修饰符的全局变量就不同了,加上这个修饰符之后,这个全局变量的作用域就仅限于该C文件。其他文件是无法访问到这个"全局"变量,也无法更改它的值的。
跟那些面向对象的语言比比,一个C文件也就是一个类或者说模块而已。这么一来,你就可以把所谓的"静态全局"变量看成这个C"类"中的private字段,而C文件中定义的各种函数就是各种"类"的方法。虽然这些字段无法做到"每一个实例都有各自的字段",但是往往嵌入式系统中很多模块都是独一无二的,不需要定义类之后再用类创造很多实例。用"静态全局变量"来管理和封装这些模块内部的特性就很漂亮,外部无法访问到这些特性,只有模块内部定义的函数才能修改读入这些值。这样子做测试、调bug也会轻松好多。
所以现在,我对全局变量一点没有偏见,加了static的全局变量都可以视为封装在该文件域内部的东西,不会被其他C文件获知,也就没有必要如临大敌了,因为你在其他c文件里根本访问不到那些变量嘛XD
而且,"成员函数可以随意访问类内的字段"不是早就成为面向对象语言的公理了么。况且现在市面上但凡讲得深入些的软件构造书籍无不是冲着OOP说的。我们C语言程序员虽然根植于底层但是也向往那种幸福快乐简单编程的感觉啊。所以虽然编译器不支持,但是偶尔用C模仿一下部分C++的功能也是无伤大雅的。因为这种OOP编程规范已经总结得非常彻底了,市面上的书随便买买可以把我整个人埋掉,哪里吃不准怎么办看看书就可以了。
关于全局变量,static,define和const的更多相关文章
- IOS 基础-define、const、extern、全局变量
这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...
- iOS学习——#define、const、typedef的区别
在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...
- #define和const的区别(转)
这个区别用从几个角度来说: 角度1:就定义常量说的话:const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型. 角度2:就起作用的阶段而言:define是在编译的预处理阶 ...
- c++中 #define和const的区别
来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364 这个区别用从几个角度来说: 角度1: 就定义常量说的话: const 定 ...
- PHP中定义常量define与const
我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...
- PHP中的Define和Const区别
我们经常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,那么define和const有什么区别呢? 常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其 ...
- PHP中定义常量的区别,define() 与 const
正文 在PHP5.3中,有两种方法可以定义常量: 使用const关键字 使用define()方法 const FOO = 'BAR'; define('FOO','BAR'); 这两种方式的根本区 ...
- #define和const的简单区别
面试常问:宏#define和const有什么区别? 1.编译器处理方式 define宏是在预处理阶段展开 const常量是在编译阶段使用 2.类型和安全检查不同 define宏没有类型,不做安全检查, ...
- 宏定义define和const的区别
define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...
随机推荐
- UDP套接字编程 返回系统时间
计算机网络实验 简单UDP套接字编程 这是学校老师自己改进了一点的题目.我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西! 我的任务是做客户端和 ...
- day1||python
测试题: 0. Python 是什么类型的语言? Python是一种面向对象.解释型.动态类型计算机程序设计语言解释型:程序无需编译成二进制代码,而是在执行时对语句一条一条编译动态类型:在程序执行过程 ...
- React 生命周期简介
React 中组件的生命周期会经历如下三个过程:装载过程.更新过程.卸载过程. 装载过程:组件实例被创建和插入 DOM 树的过程: 更新过程:组件被重新渲染的过程: 卸载过程:组件从 DOM 树 ...
- legend_noa 的 EMACS配置
(defun my-c-mode-auto-pair() (interactive) (make-local-variable'skeleton-pair-alist) (setq skeleton- ...
- html基础学习笔记1
<!DOCTYPE html> 声明为 HTML5 文档 <html> 元素是 HTML 页面的根元素 <head> 元素包含了文档的元(meta)数据,如 &l ...
- day-12函数对象
函数默认值的细节 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值,后面变化不会再变化 a = 100 def fn(num=a): a = 200 fn() 三元 ...
- mysql的事务和数据库锁的关系
数据库加事务并不是数据就安全来了,事务和锁要分析清楚和配合使用 问题背景处于对高并发的秒杀环节的理解整理如下: 秒杀的时候高并发主要注意1.在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成 ...
- ie 9.10 兼容性问题 遇到的坑
1.ie9 中ajax 跨域调用时 error报错信息为”No Transport” 原因是 ajax跨域 本人用的是 cors解决方案 但是ie9一下版本 对cors默认是不允许的所以需要我们自 ...
- 使用starUML画顺序图
https://blog.csdn.net/gary0917/article/details/79968762
- 7_CentOS下安装和卸载AdobeReader
曾经最喜欢Fedora 版本的Linux,但是因为现在Fedora的界面实在太花里胡哨了,所以最近开始捣鼓CenOS,本来 RedHat的EL版本也是一个不错的选择,最后想想还是用社区版的. 话说Ce ...