Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

persistent local variable in c

Are persistent variables not widely used? I couldn't find much info about them online or in the index of my C textbook - the Art and Science of C.

Anything you can share about them, especially their scope and example declaration would be helpful. I'm guessing to declare them you use 'persistent' as the keyword?

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

This is the only other helpful reference I could find: “Persistent variables keep their state when the board is turned off and on, when main is run, and when system reset occurs. Persistent variables will lose their state when code is downloaded as a result of loading or unloading a file.” http://www.newtonlabs.com/ic/ic_5.html#SEC9

thanks!

like image 607
tarabyte Avatar asked Dec 12 '22 17:12

tarabyte


2 Answers

Interactive C (the link you provided) provides the persistent keyword, but that is not standard C. Particularly since guarantees like "keep their state when the board is turned off and on, when main is run, and when system reset occurs".

persistent is provided with the Interactive C compiler and works with dedicated hardware, Motorola chip in this case, storing the variable value in non-volatile memory to achieve persistence over restarts.

Interactive C is a C compilation environment for many Motorola 6811 based robots and embedded systems. Originally developed for the MIT LEGO Robot Design Contest (6.270), Interactive C has enjoyed widespread distribution and use. Interactive C's claim to fame is its interactivity: users can type in expressions and have them compiled on the fly and run immediately, rather than waiting for lengthy compile and download cycles. IC currently supports the 6.270, the HandyBoard and the RugWarrior and RugWarrior Pro. source.

To achieve variable persistence in a local scope (e.g. function), use the static keyword.

like image 169
jkerian Avatar answered Feb 03 '23 11:02

jkerian


The keyword you want is static in local (not global) context.

The context thing is important:

#include <stdio.h>

static int foo;

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

Here static means that foo has file scope (i.e. is not extern).

Whereas in

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

last is persistent between calls to strtok.

All that said, they are rarely used because they are rarely useful, and are totally unacceptable in a multi-threaded context (where they are a race condition waiting to happen).

like image 38
dmckee --- ex-moderator kitten Avatar answered Feb 03 '23 11:02

dmckee --- ex-moderator kitten