Что делает статическое ключевое слово c ++ с фигурными скобками? - PullRequest
4 голосов
/ 24 февраля 2012

Я где-то нашел этот код, генератор шума Perlin, я думаю:

static {
    for(int i=0; i<512; i++) perm[i]=p[i & 255];
}

Что там делает статика? он также был спамен во многих других местах ... Код был практически собран везде со статическим {}. Я где-то потерял исходный код, так что это единственное, что у меня есть, но это было похоже на код выше: там нет объявлений переменных, поэтому я его не получаю.

Ответы [ 3 ]

9 голосов
/ 24 февраля 2012

Я думаю, что это Java, а не C ++, что означает, что это статический блок инициализации .

6 голосов
/ 24 февраля 2012

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

2 голосов
/ 24 февраля 2012

Документация по ключевому слову static в состояниях MSDN может использоваться в следующих ситуациях:

  1. Когда вы объявляете переменную или функцию в области видимости файла.
  2. Когда вы объявляете переменную в функции ...
  3. Когда вы объявляете член данных в объявлении класса
  4. Когда вы объявляете функцию-член в объявлении класса ...

Использование ключевого слова static для объявления локальной области действия здесь не указано, поэтому недопустимо.

Если вы попытаетесь записать его в теле функции:

void foo(){
    static{
        int i = 0;
    }
}

это приведет к "ошибке C2143: синтаксическая ошибка: отсутствует ';'до '{' ', потому что ожидается объявление переменной.Если вы замените static{ на static;{, ключевое слово static игнорируется, поэтому ваш код становится компилируемым, но компилятор все равно предупредит вас: "предупреждение C4091:« статическое »: игнорируется слева от« int »когда переменная не объявлена ​​".

Если вы попытаетесь записать ее вне тела функции, это приведет к ошибке " C2447: '{':отсутствует заголовок функции (формальный список старого стиля?) ", поскольку ожидается объявление функции.

...