其实按照现在主流的观点,应该尽量少用全局变量和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. 我的代码-normalize

    # coding: utf-8 # In[13]: import pandas as pdimport numpy as npimport scipy as spfrom os import list ...

  2. PAT1001A+B Format

    链接:https://www.patest.cn/contests/pat-a-practise/1001 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 ...

  3. 使用getInstance()方法的原因及作用

    使用getInstance()方法的原因及作用 先举例说明: 下面是一个例子,为什么要把这个类实例化?有什么好处? //实例化 public static DBConnect instance; pu ...

  4. 自建yum仓库,分别为网络源和本地源

    配置本地源 建立本地源目录 [root@qingcheng-db lgp]#mkdir /mnt/cdrom [root@qingcheng-db lgp]#mkdir /yum 挂载Centos光盘 ...

  5. VS 2017 + opencv4.0

    完全参考这一文章, 非常详细: https://blog.csdn.net/qq_41175905/article/details/80560429 记录自己遇到的问题: 1. VS 2017 专业版 ...

  6. 做web开发的时候老是把颜色码忘记了,特地来写个博客,以后方便找。

    对照表 英文代码 形像颜色 HEX格式 RGB格式 LightPink 浅粉色 #FFB6C1 255,182,193 Pink 粉红 #FFC0CB 255,192,203 Crimson 猩红 # ...

  7. [R] 繪圖 Par 函数

    本篇內文主引用 https://zhuanlan.zhihu.com/p/21394945 之內容再稍加整理並參照下方有用資源 [rdocumentation] https://www.rdocume ...

  8. java8_api_net

    网络编程1    操作ip地址        核心类 InetAddress        相关方法 getByName,getAllByName,getLocalHost    操作socket地址 ...

  9. 18.25 JLink调试程序步骤

    S3C2440开发板启动时候选择NandFlash启动,然后输入如下命令: r                                 /*复位cpu*/ h                  ...

  10. 百度短信API开发

    由于楼主学的是C#,所以目前做的百度短信API是C#版的,废话不说了,直接上代码. public void PostData() { string url = "http://sms.bj. ...