关于全局变量,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.编译器处理方式不同 ...
随机推荐
- SQA计划
一.SQA计划 1.软件工程 所做程序是一个长沙大学的学习app系统 .可以实现用户的注册登录,课程学习,以及活动参加.根据需求建模,进行体系结构设计,然后设计. 2.质量保证 (1)项目需要符合IE ...
- c——闰年
PTA #include<stdio.h> int main() { int year,month,day,cnt,flag; flag = ; scanf("%4d/%2d/% ...
- linux 下 mysql 常用命令
linux 下 mysql 常用命令 阅读目录 ====================== 1.开启和关闭 1.1.开启 1.2.关闭 1.3.重启 2.登录 2.1.密码明文 2.2.密码密文 ...
- Python练习五
1.用文件操作的方式,创建登录注册功能,允许用户输错三次. user = input("请输入你要注册的用户名:") password = input("请输入你要注册的 ...
- 终于懂得Perl句柄是什么意思了
一直以来就对Perl语言特别感兴趣,去年特别膨胀的 直接买了一本大骆驼书,想好好看看Perl编程,结果看到I/O,句柄的时候就觉得云山雾罩,不知道是在说啥了, 最近,京东打折,终于有机会又买了本小骆驼 ...
- 代理IP
代理IP 一.获取代理IP 二.使用代理IP 1.requests 2. selenium 2.1 selenium+chrome 2.2 selenium+Firefox 2.3 selenium+ ...
- redux源码解读(一)
redux 的源码虽然代码量并不多(除去注释大概300行吧).但是,因为函数式编程的思想在里面体现得淋漓尽致,理解起来并不太容易,所以准备使用三篇文章来分析. 第一篇,主要研究 redux 的核心思想 ...
- java 运算符的优先级比较
口诀:淡云一笔安洛三福 单目>算数运算符>移位>比较>按位>逻辑>三目>赋值 单目运算符:+,-,++,-- 算数运算符:+,-,*,/,% 移位运算符:&l ...
- voc-fcn-alexnet网络结构理解
一.写在前面 fcn是首次使用cnn来实现语义分割的,论文地址:fully convolutional networks for semantic segmentation 实现代码地址:https: ...
- Java8-Optional与null
对null进行处理 程序中经常需要对null情况进行处理,比如Course类中有一个List stuList属性,Student有一个name属性. 现在想要查看某个student的name属性的长度 ...