嵌入式开发:在C中使用静态关键字

更新时间: 2022-08-17 09:23:52来源: 粤嵌教育浏览量:6685

  C语言中有许多主题经常让嵌入式开发人员感到困惑,但静态关键字的使用似乎是更常见的一种。困惑的一点是静态如何影响局部变量和全局变量。在每种情况下,静态关键字对数据的存储位置以及它如何在整个程序生命周期中持续存在有不同的影响。静态关键字有三个主要用途;函数中的局部变量、模块中的全局变量和模块中的函数。在这篇文章中,我们将研究所有这三种用法,以及它们如何影响变量的存储位置,以及静态的使用如何提高代码质量。

  一般来说,静态是一个存储类说明符,可以应用于任何数据类型。虽然静态有许多定义,但最适合所有这三种用途的定义是,静态告诉编译器限制变量或函数的范围,同时允许它在程序的整个生命周期中保持不变。这允许使用静态封装或隐藏变量,以防止意外访问。然后,开发人员能够严格控制如何在模块中访问变量,这被认为是良好的编程实践。

  当在函数中声明变量而没有使用静态时,该变量被认为是自动变量。自动变量被创建并存储在堆栈中(或CPU寄存器中),当函数返回时被销毁。如果嵌入式开发人员希望函数中的变量在两次调用之间保持其值,那么该变量将被声明为静态变量。在这种情况下,变量将不再存储在堆栈中,而是存储在全局内存空间中;然而,即使变量本身存储在全局空间中,编译器也会对变量施加局部作用域,使其仅在该函数中可见!模块中的其他函数不知道这个变量的存在。不仅变量将在程序的整个生命周期中保持其值,静态变量也将仅在第一次调用函数时被初始化。

  


  在模块的全局范围内定义一个变量(但在整个程序的上下文中不是全局的)隐式地声明该变量是静态的。这使得变量被定义在全局内存空间中,同时将变量的范围限制在模块中。将这些变量显式声明为静态总是一个好主意,以提醒自己它们有一个模块范围,并且不是自动变量。良好的编程实践表明,变量应该在最局部的适用范围内声明。因此,如果变量只在单个函数中使用,那么嵌入式开发人员声明变量的更合适的位置可能是在函数本身而不是模块范围内。在模块级声明的静态变量只在处理器初始化时发生的C复制过程中初始化一次。

  静态也可以应用于模块中的函数。默认情况下,函数被隐式声明为extern。这意味着,如果一个函数是在c文件中定义的,而不是在头文件中原型化的,编译器仍然能够链接到该函数(可能会给开发人员一些警告)。为了使一个函数只在一个模块中可用,开发人员可以将静态关键字放在函数声明之前。这将有效地对外界隐藏该函数,并保护该函数及其变量的使用。

  静态关键字有许多用途。它最有效的用途是限制模块或函数中定义的变量的范围。嵌入式开发人员通过使用静态,变量和函数可以对外部程序隐藏,从而产生类似于在更现代的面向对象语言中使用私有和公共的行为。

免费预约试听课