статичный - используемый только для ограничения объема?

myStr.Replace("([^\r])\n", "$1\r\n");

$, возможно, должен быть \

7
задан chronodekar 25 November 2009 в 08:13
поделиться

6 ответов

Ключевое слово static служит двум различным целям в C: то, что я называю продолжительностью (время жизни объекта) и видимостью (откуда вы можете использовать объект). Имейте в виду, что стандарт C на самом деле использует разные слова для этих двух концепций, но при обучении языку я обнаружил, что для начала лучше всего использовать повседневные термины.

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

Статические переменные на уровне файла невидимы для чего-либо за пределами перевода unit (компоновщик не может его видеть)

При использовании на уровне функции (внутри функции) он контролирует продолжительность. Который'

12
ответ дан 6 December 2019 в 06:36
поделиться

Пример дополнения ответа Кинопико:

#include <stdio.h>

int foo() {
    static int foo = 0;
    return ++foo;
}

int main() {
    printf("%i\n", foo()); // 1
    printf("%i\n", foo()); // 2
}

Это можно использовать, например, для возврата безопасного указателя на локальную функциональную переменную. Или в Objective-C он иногда используется для защиты от повторной инициализации класса:

- (void) initialize
{
    static BOOL initialized = NO;
    if (initialized)
        return;
    // …perform initialization…
    initialized = YES;
}
3
ответ дан 6 December 2019 в 06:36
поделиться

Переменная может иметь три типа хранилища:

  1. В статической области программы
  2. В стеке (во время вызова функции)
  3. В куче (при выделении с помощью new / malloc)

Глобальные переменные всегда хранятся в статической области. Но чтобы сохранить локальную переменную в статической области, вам потребуется ключевое слово static . Поскольку статическая переменная не размещается в стеке, вы можете получить доступ к этой переменной при последующих вызовах.
Также ключевое слово static в глобальной области дает внутреннюю связь переменной. Следовательно, переменная не может быть доступна из какого-либо другого файла с использованием квалификатора extern .

1
ответ дан 6 December 2019 в 06:36
поделиться

Вы неправильно употребляете термин «область действия». static в C не имеет абсолютно ничего общего с областью видимости.

Область действия - это область, в которой отображается имя объекта (переменная, функция, имя типа и т. Д.). В языке C "файловая область" - это самая большая область за всю историю. По этой причине нет смысла ограничивать что-либо одним файлом: просто нечего ограничивать. В C. нет такой вещи, как «глобальная область видимости». Термин «глобальная область видимости» иногда используется неофициально, но в этом случае он имеет то же значение, что и «область действия файла».

Опять же, static in C абсолютно не имеет ничего общего с областью видимости . static в C влияет на продолжительность хранения объекта и связь идентификатора. При использовании с объектами (переменными) static дает объекту статическую продолжительность хранения (т.е. объект существует, пока выполняется программа). И при использовании с идентификаторами нелокальных объектов или функций он дает им внутреннюю связь , что означает, что один и тот же идентификатор относится к одному и тому же объекту в одной единице преобразования (где объект определен), но нет в других единицах перевода.

5
ответ дан 6 December 2019 в 06:36
поделиться

Вы правы, это называется «статическая связь»: символ объявлен как static ] доступен только в модуле компиляции, в котором он определен.

Другое использование static будет внутри функции:

void f() {
  static int counter = 0;
  counter++;
  // ...
}

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

1
ответ дан 6 December 2019 в 06:36
поделиться

Я думаю, вам нужно использовать MDC.Set для установки дополнительных значений контекста. Посмотрите совет № 4 в этом блоге .

Я нашел пример здесь . Напротив, переменные, которые создаются заново при каждом вызове функции, называются автоматическими.

4
ответ дан 6 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: