2010-12-05 128 views
3

持久变量是否被广泛使用?我无法找到关于他们的很多信息在网上或在我的C教科书的指标 - 艺术和C.科学c中的持久局部变量

任何你可以分享他们,尤其是他们的范围和声明例子将是有益的。我猜要宣布他们使用“持久性”作为关键字?

static void foo(void) { 
    persistent unsigned int width = 5; 
} 

这是唯一的其他有用的参考,我可以找到: “持久变量保持自己的状态时,板关闭和开启,主时运行,并在系统复位时。当代码由于加载或卸载文件而下载时,持久变量将会丢失状态。“ http://www.newtonlabs.com/ic/ic_5.html#SEC9

谢谢!

回答

3

你需要的关键字是static在本地(不是全局)上下文中。

上下文件事是重要的:

#include <stdio.h> 

static int foo; 

int main(int argc, char **argv){ 
    //... 
} 

这里static意味着foo具有文件作用域(即不是extern)。

而在

char *strtok(char *str, char *sep){ 
    static char *last; 
    //... 
} 

last是调用strtok之间持续。所有这些都说明了它们很少被使用,因为它们很少有用,并且在多线程环境中(它们是等待发生的竞争条件)是完全不可接受的。

+0

哇,当我参加我的第一堂课时,回到这个线程。我不知道'持久'是什么意思。再次感谢所有 – tarabyte 2013-09-18 16:55:31

+0

这个答案有点不符合标记。 'static'关键字与变量作用域有关,并且是C标准的一部分。 `persistent`关键字控制变量内存在启动时如何初始化,而不是标准C.请参阅https://stackoverflow.com/a/4357304/973624以获取更完整的答案。 – mrtumnus 2017-10-02 21:19:20

8

交互式C(您提供的链接)提供了persistent关键字,但该不是标准C。特别是由于像“”这样的保证在电路板关闭和开启时保持其状态,当主要运行时以及发生系统复位时“。

persistent提供交互式C语言编译器,并与专用硬件一起使用,在这种情况下使用摩托罗拉芯片,将变量值存储在非易失性存储器中以实现重启时的持久性。

Interactive C是许多基于Motorola 6811的机器人和嵌入式系统的C编译环境。 Interactive C最初是为麻省理工学院乐高机器人设计竞赛(6.270)开发的,因此广泛分发和使用。 Interactive C声誉卓着的是它的交互性:用户可以输入表达式并让它们即时编译并立即运行,而不是等待冗长的编译和下载周期。 IC目前支持6.270,HandyBoard和RugWarrior和RugWarrior Pro。 source

要在本地作用域(例如函数)中实现可变持久性,请使用关键字static

0

正如jkerian所提到的,持久变量在电路板关闭时保持其状态...但被C启动代码(依赖于编译器)排除,因为唯一可用于此的内存是EEPROM。

与其他变量一样,存储在易失性存储器中的持久变量在丢失功率时会丢失内容。但是这种变量在FRAM设备上很有用。 FRAM是铁电RAM的首字母缩写,它是一种非易失性存储器,即使在断电后也能保存数据。 注意:在COFF模式下的CCS中,未初始化的变量未设置为0(以节省启动时间),因此始终保持不变。