используя статическое ключевое слово в локальной области видимости C для работы - PullRequest
2 голосов
/ 30 марта 2009

Есть ли разница в этих двух? Если так, то в чем именно разница? Предположим, они находятся в функции C, которую можно вызывать несколько раз.

  1. объявлять и присваивать в том же заявлении

    static uint32_t value = x; // x varies and may be passed into function.

  2. объявить в одном утверждении и назначить в следующем утверждении.

    static uint32_t value;

    value = x; // x varies;

value обновляется только при первом объявлении / инициализации или даже при последующих вызовах.

Мое понимание (1) состоит в том, что он устанавливается только в первый раз, когда строка выполняется, поэтому даже если x изменится при следующем выполнении строки, value останется прежним. Я не уверен насчет (2), но разъяснения по обоим будут очень полезны

РЕДАКТИРОВАТЬ: ARM компилятора (ADS1.20). РЕДАКТИРОВАТЬ: дополнительный вопрос (2) из ​​ответов, данных до сих пор. Повторяется ли декларация (не присвоение) при каждом вызове или только в первый раз?

Ответы [ 6 ]

11 голосов
/ 30 марта 2009

Первый не должен компилироваться; статическая переменная требует постоянного инициализатора.

Второй устанавливает value каждый раз, когда вызывается функция, поэтому не было необходимости делать ее static в первую очередь.

Если первое обозначение было правильным - инициализировано, скажем, value - 1, то оно будет инициализировано один раз при запуске программы и впоследствии будет принимать новые значения только тогда, когда код его изменил. Второе обозначение по-прежнему устанавливает value при каждом вызове функции, и поэтому использование static бессмысленно. (Хорошо, если вы попытаетесь достаточно усердно, вы можете разработать сценарии, в которых вторая версия будет использовать статические. Например, если функция возвращает указатель на нее, который затем модифицируется другим кодом, тогда это может быть необходимо, но в высшей степени эзотеричен и был бы довольно неприятным «запахом кода».)

2 голосов
/ 30 марта 2009

Это очень разные декларации.

Первый - объявление статической локальной переменной и присвоение ей начального значения (на самом деле это не должно компилироваться, если x не является константой). Это произойдет только один раз, прежде чем каждая функция будет выполнена. Это почти наверняка инициализация, которую вы хотите.

Второе объявление обновляет значение каждый раз, когда вызывается функция. Если вы хотите, чтобы переменная всегда запускала функцию с одним и тем же значением, это правильный подход. Но если это действительно то, что вы хотите, то зачем вообще использовать статический? Просто используйте локальную переменную.

2 голосов
/ 30 марта 2009

1 выполняется только один раз, но для 2 значение будет переназначаться каждый раз. Статические переменные инициализируются только один раз.

0 голосов
/ 26 сентября 2013

Народ - В Си первая декларация совершенно законна. Он скомпилируется и может быть использован для инициализации значения. Вы можете объединить строку кода из второго объявления, чтобы она обновлялась при каждом последующем выполнении функции. Это обычно используется, в частности, во встроенных программах, где память и ресурсы более скудны, чем компьютеры или распределенные приложения.

Причина, по которой вы бы использовали статический, заключается в том, что переменная имеет жизненный цикл данных, который продолжается на протяжении всего выполнения программы, при этом ограничивая ее доступ только к функции, объявленной статическим, или любой функции в файле, если статическое объявление включено в верхней части файла, в противном случае данные будут потеряны при каждом выходе из функции. Это хорошая практика программирования, позволяющая избежать случайного доступа к объектам данных, которые должны быть защищены и ограничены. Этот комментарий относится только к языку программирования C, не путайте его с заявлением о C ++ (где это происходит в некоторых случаях) или JAVA. Статика в Java имеет совершенно другое значение. Из того, что я читал в этой теме, мало кто понимает, как работает ключевое слово static в C, и путает ключевое слово static с другими языками, которые применяются в C. В C static очень важное ключевое слово, которое помогает управлять функцией и доступ к данным, и вы можете инициализировать статическую переменную с другой переменной при условии, что она находится в области видимости, и вы можете обновлять это значение во время выполнения программы, что, вероятно, в любом случае будет необходимо.

0 голосов
/ 01 апреля 2009

После компиляции первый будет помещен в раздел «.data», где инициализируются данные, а второй будет помещен в раздел «.bss», где данные неинициализированы.

Используйте readelf -S xx.o, чтобы проверить размер раздела скомпилированного объектного файла.

пример 1: static int i;

void test(){
    i = 2; 
}

пример 2:

 static int i=1;

void test(){
    i = 2; 
}
0 голосов
/ 30 марта 2009

Ваша интуиция права. Во втором примере значение устанавливается в x каждый раз, когда вызывается метод. Статические переменные должны быть инициализированы и объявлены в одном выражении, если вы хотите, чтобы он запускался один раз.

Если вы всегда хотите, чтобы значение имело значение x, не объявляйте его как статическое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...