постоянная локальная переменная в c - PullRequest
4 голосов
/ 05 декабря 2010

Постоянные переменные не используются широко? Я не мог найти много информации о них в Интернете или в указателе моего учебника по Си - Искусство и наука о С.

Все, что вы можете рассказать о них, особенно их область действия и пример объявления , будет полезно. Я предполагаю, чтобы объявить их, вы используете "постоянный" в качестве ключевого слова?

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

Это единственная другая полезная ссылка, которую я смог найти: «Постоянные переменные сохраняют свое состояние, когда плата выключается и включается, когда выполняется основное и когда происходит перезагрузка системы. Постоянные переменные теряют свое состояние при загрузке кода в результате загрузки или выгрузки файла ». http://www.newtonlabs.com/ic/ic_5.html#SEC9

спасибо!

Ответы [ 3 ]

8 голосов
/ 05 декабря 2010

Interactive C (ссылка, которую вы указали) содержит ключевое слово persistent, но не является стандартным C .Тем более, что гарантии типа « сохраняют свое состояние, когда плата выключается и включается, когда выполняется основное и когда происходит сброс системы ».

persistent предоставляется с Interactive Cкомпилятор и работает с выделенным оборудованием, в данном случае - с чипом Motorola, сохраняя значение переменной в энергонезависимой памяти, чтобы обеспечить постоянство при перезапусках.

Interactive C - это среда компиляции C для многих роботов на базе Motorola 6811и встраиваемые системы.Изначально разработанный для MIT LEGO Robot Design Contest (6.270), Interactive C получил широкое распространение и использование.Заявление Interactive C о славе заключается в его интерактивности: пользователи могут набирать выражения и сразу же их компилировать и запускать, не дожидаясь длительных циклов компиляции и загрузки.В настоящее время IC поддерживает 6.270, HandyBoard и RugWarrior и RugWarrior Pro. source .

Чтобы обеспечить постоянство переменных в локальной области (например, функции), используйте ключевое слово static.

3 голосов
/ 05 декабря 2010

Ключевое слово, которое вы хотите: 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 голосов
/ 09 апреля 2016

Как упоминал jkerian, постоянные переменные сохраняют свое состояние, когда плата выключается и включается ... но исключаются кодом запуска C (который зависит от компилятора), потому что единственная память, которая может использоваться для этого, это EEPROM.

Как и другие переменные, постоянные переменные, хранящиеся в энергозависимой памяти, теряют контент при отключении питания. Но этот тип переменной полезен на устройстве с FRAM. FRAM - это сокращение от сегнетоэлектрического ОЗУ, которое является энергонезависимой памятью, которая может хранить данные даже после выключения. Примечание: в CCS в режиме COFF неинициализированные переменные не были установлены в 0 (для экономии времени запуска) и поэтому всегда были постоянными.

...