其实按照现在主流的观点,应该尽量少用全局变量和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的更多相关文章

  1. IOS 基础-define、const、extern、全局变量

    这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...

  2. iOS学习——#define、const、typedef的区别

    在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...

  3. #define和const的区别(转)

    这个区别用从几个角度来说: 角度1:就定义常量说的话:const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型. 角度2:就起作用的阶段而言:define是在编译的预处理阶 ...

  4. c++中 #define和const的区别

    来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364 这个区别用从几个角度来说: 角度1: 就定义常量说的话:  const 定 ...

  5. PHP中定义常量define与const

    我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...

  6. PHP中的Define和Const区别

    我们经常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,那么define和const有什么区别呢? 常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其 ...

  7. PHP中定义常量的区别,define() 与 const

      正文 在PHP5.3中,有两种方法可以定义常量: 使用const关键字 使用define()方法 const FOO = 'BAR'; define('FOO','BAR'); 这两种方式的根本区 ...

  8. #define和const的简单区别

    面试常问:宏#define和const有什么区别? 1.编译器处理方式 define宏是在预处理阶段展开 const常量是在编译阶段使用 2.类型和安全检查不同 define宏没有类型,不做安全检查, ...

  9. 宏定义define和const的区别

    define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...

随机推荐

  1. 《构建之法》chapter5,6 读书心得

    <构建之法>第五章用体育运动等团队例子引出软件开发团队的形式,用更加生活化.形象化的例子让读者更能理解软件开发团队的形式.软件团队形式多样,适用于不同的人员与需求.团队可能会演变的模式有: ...

  2. docs actifio

    http://docs.actifio.com/ https://www.actifio.com/resource-center/

  3. Servlet接口UML图

    Servlet.class源码

  4. mysql 生成时间序列数据 - 存储过程

    由于时间自动转换为int值, 做一步转化,也可在调用时处理 use `test`; CREATE table test.test1 as SELECT state, id, `规格条码`, `色号条码 ...

  5. 005-docker启动设置环境变量

    https://blog.csdn.net/wsbgmofo/article/details/79173920

  6. apache做反向代理

    实验目的 通过apache实现反向代理的功能,类似nginx反向代理和haproxy反向代理 环境准备 逻辑架构如下 前端是apche服务器,监听80端口,后端有两台web服务器,分别是node1和n ...

  7. Django学习笔记之视图高级-类视图

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  8. Java面试题之Forward和Redirect的区别

    redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失.举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去公安局办(index.html) ...

  9. 支持向量机(Support Vector Machine,SVM)

    SVM: 1. 线性与非线性 核函数: 2. 与神经网络关系 置信区间结构: 3. 训练方法: 4.SVM light,LS-SVM: 5. VC维 u-SVC 与 c-SVC 区别? 除参数不同外, ...

  10. opcache 参数说明 --转自https://www.cnblogs.com/tudou1223/p/5362785.html

    PHP的opcode缓存又出了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址(http://www.php.net/manual ...