Компилятор Microsoft C: объявление встроенной переменной?

Я пишу C в Visual Studio 2010. Компилятор, похоже, не хочет позволять мне использовать объявления встроенных переменных. Следующий код вызывает ошибку:

unsigned int fibonacci_iterative(unsigned int n) {
 if (n == 0) {
  return 0;
 }
 if (n == 1) {
  return 1;
 }

 unsigned int prev_prev = 0; // error
 unsigned int prev = 1; // error
 unsigned int next = 0; // error
 for (int term_number = 0; term_number < n; term_number++) {
  unsigned int temp = prev_prev + prev;
  prev = next;
  prev_prev = prev;
  next = temp;
 }

 return next;
}

Ошибка:

ошибка C2143: синтаксическая ошибка: отсутствует ';' перед "типом"

ошибка C2143: синтаксическая ошибка: отсутствует ';' перед "типом"

ошибка C2143: синтаксическая ошибка: отсутствует ';' перед "типом"

Почему это происходит? Есть ли параметр, чтобы сделать компилятор не настолько строгим?

Ответ 1

Включение объявлений после не деклараций в C89 запрещено, хотя это разрешено на С++ и C99 (однако MSVC по-прежнему не поддерживает C99).

В C89 вы можете добиться аналогичного эффекта, используя вложенный блок:

unsigned int fibonacci_iterative(unsigned int n) {
    if (...) {
    }

    {
       unsigned int prev_prev = 0;
       unsigned int prev = 1;
       unsigned int next = 0;
       ...
    }
 }

Ответ 2

Попробуйте скомпилировать его как С++. C99 позволяет объявлять переменные, отличные от верхней части области видимости, но VC не знает о C99.

Ответ 3

Объявления встроенной переменной поддерживаются только в компиляторе, совместимом с C99. Microsoft Visual С++, похоже, не совместим с C99 (ref). Вам придется либо использовать C99-совместимый компилятор (GCC будет компилировать код с встроенными переменными при использовании с -std=c99), либо объявлять ваши переменные в верхней части функции.

EDIT: или попробуйте С++-режим, как это было предложено akallio, хотя C и С++ не являются строго совместимыми друг с другом, поэтому, если (например) вы используете любые ключевые слова на С++ в своем коде на C, t компилировать.