其实按照现在主流的观点,应该尽量少用全局变量和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. 使用 whereis/which/locate 查找文件

    whereis命令 whereis只能用于搜索可执行文件 (-b) , 联机帮助文件 (-m) 和源代码文件 (-s) . 它只在一个数据库中查询(/var/lib/mlocate) . 这个数据库是 ...

  2. P1181 数列分段Section I

    题目描述(跳转) 对于给定的一个长度为NN的正整数数列A_iAi​,现要将其分成连续的若干段,并且每段和不超过MM(可以等于MM),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 第1 ...

  3. Comedi的学习过程

    1.介绍Comedi 1.1Comedi是一个设备驱动开发的软件工具,它采用了一种3层组织模型:上层是用户层,Comedi提供了在用户控件编写程序的接口Comedilib,通过系统调用来控制硬件设备: ...

  4. STM32 BOR/POR/PDR介绍

    以STM32为例,介绍单片机中的BOR/POR/PDR1)PVD = Programmable Votage Detector 可编程电压监测器 它的作用是监视供电电压,在供电电压下降到给定的阀值以下 ...

  5. jquery案例

    调用js成员 <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>& ...

  6. Android Studio学习之build.gradle文件

    参考书籍:第一行代码 最外层目录下的build.gradle buildscript{repositories{ jcenter() //代码托管仓库 } dependencies{ classpat ...

  7. Java小代码

    1. public class test1 {public static void main(String[] args) { Person P = new Person("gdsgds&q ...

  8. 使用composer遇到的坑

    平台:Windows下cmd命令行內 問題 [Composer\Downloader\TransportException] The "https://packagist.phpcompos ...

  9. form表单提交数据,页面必定会刷新,ajax提交数据不会刷新,做到悄悄提交,多选删除,ajax提交实例

    很多页面用到的模态对话框,如知明网站https://dig.chouti.com/的登录页都是模态对话框, 当点登录时,是用的ajax提交,因为输入错了信息,有返回消息,而页面没有刷新. jquery ...

  10. nginx 配置说明

    ======nginx 配置文件分开==== http://blog.csdn.net/baple/article/details/44197981 1.备份现在有nginx.conf2.复制ngin ...