如何有效减少全局变量的使用?全局变量有时是不可避免的,只能尽量减少。虽然全局变量也可以达到上述目的,但是全局变量有时会造成意想不到的副作用(尤其是简称全局变量的变量名污染非常严重),所以使用局部静态变量还是比较合适的,为什么在单片机的程序中大量使用全局变量?这些变量是重要的计算结果,在很多场合或子程序中都要用到,相反,那些比较临时的数据被定义为局部变量,你自然会知道哪些局部变量该用,哪些该用。
是的,全局变量是在函数之外定义的变量。它的作用域是整个源文件,可以在当前源文件的任何函数中使用。一旦定义了全局变量,它的作用域就不再局限于定义它的函数,而是扩展到整个源文件。在任何需要使用这个变量的函数中,都可以直接使用它的变量名进行操作,而不需要传递变量。值得注意的是,在多个源文件中用相同的名称定义全局变量会导致命名冲突,所以要特别注意全局变量的命名。
具体来说,当您在源文件中定义全局变量时,该变量可以在源文件中的任何函数中使用,包括main函数和其他自定义函数。此外,如果您需要在另一个源文件中使用该变量,您可以通过在该源文件中声明它来访问它。需要注意的是,在多文件程序中,全局变量可能存在命名冲突。如果在不同的源文件中定义了同名的全局变量,链接器将在链接时出错。
调用变量输出或使用时,遵循就近原则。这可以理解为,在一个方法中使用就是寻找最接近这个变量的定义,此时使用的值就是这个变量的值。首先遵循命名规则看起来舒服,然后尽量少用,尽量复用。能少用就少用。如果可以在使用前声明,就不要先声明。像C和C一样,字母、数字和下划线不能使用系统关键字。覆盖初始值2以区分局部和全局,
1。一个函数不能总是被调用,所以在没有被调用的时候给它赋一个全局变量是一种浪费。2.一个函数不能同时只调用一次。最简单的例子就是函数调用自己。另一个最简单的例子是多线程。如果把所有变量都设为全局变量,有很多弊端:1。浪费内存。由全局变量应用的内存直到程序结束才会被释放。2.命名空间污染,所有变量都在同一个命名空间。比如你用一个I进行循环控制,那么控制全局变量的时候就需要I,ii,iii,不可读。
按照原写法,你定义了两个形参X和Y,因为是同名的局部变量,作用域比全局变量X和Y小,全局变量X和Y的运算会暂时隐藏。可以直接调用函数中的全局变量stringx,y;Stringcompare(){//随心所欲,比如//if(x > y)//returnx;}intmain(){//...}。修改程序时一个事件牵一发而动全身的现象不是全局变量的原因。
全局变量和局部变量的区别是:有效范围不同,内存空间不同,使用间隔不同。局部变量只在这个函数范围内有效,不能在这个函数之外使用。全局变量的有效范围是从定义变量的位置到源文件的末尾。局部变量是程序运行到函数时分配给变量的内存空间,函数结束时释放内存空间。全局变量是程序运行时预先分配的内存空间,程序结束时释放内存。
使用全局变量的程序运行得更快(因为不需要重新分配内存),但也快不了多少。局部变量的命名空间污染可以在不使用太多变量的情况下避免。注意:当全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽。也可以使用extern在函数外部声明全局变量,这样从声明到文件结尾,全局变量的作用域就低于局部变量。
全局变量有时候是不可避免的,我们只能尽量减少。我能想到的主要有三个方面:1。通过函数参数传递数据或指针。对于回调函数,一个参数通常是用户定义的数据指针,可以用来传递类指针或用户定义的结构指针。2.只在某个函数中使用的变量可以定义为局部静态变量(定义在函数内部,前面有静态修饰)。3.将全局变量定义为结构和全局结构变量。
这些变量是重要的计算结果,在很多场合或子程序中都要用到。相反,越是临时的数据被定义为局部变量,越多的程序自然会知道哪些局部变量该用,哪些该用。从解耦的角度来看,全局变量越少越好。这样才能提高程序的可维护性。MCU程序中使用了大量的全局变量。一方面,基于传统MCU的资源有限,使用全局变量的开销较低。另一方面,传统的单片机程序模块少,耦合度易于手动控制。
1)静态局部变量是在函数中定义的,但与自动变量不同,它们在被调用时存在,在退出函数时消失。静态局部变量总是存在的,也就是说,它们的生存期就是整个源程序。(2)静态局部变量的生存期虽然是整个源程序,但其作用域仍然与自动变量相同,即只能在定义该变量的函数中使用。退出函数后,虽然变量仍然存在,但不能使用。(3)如果初始值没有赋给基本类型的静态局部变量,系统会自动赋一个值0。
根据静态局部变量的特点,我们可以看到它是一个生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但是当再次调用定义它的函数时可以继续使用,并且保存上次调用后留下的值,因此,当一个函数被多次调用,并且要求在调用之间保留某些变量的值时,可以考虑静态局部变量。虽然全局变量也可以达到上述目的,但是全局变量有时会造成意想不到的副作用(尤其是简称全局变量的变量名污染非常严重),所以使用局部静态变量还是比较合适的。