Компилятор Microsoft C: встроенное объявление переменных? - PullRequest
11 голосов
/ 31 января 2010

Я пишу 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: синтаксическая ошибка: отсутствует ';' перед «типом»

Почему это происходит? Есть ли настройка, позволяющая сделать компилятор не таким строгим?

Ответы [ 3 ]

10 голосов
/ 31 января 2010

Размещение деклараций после не деклараций не разрешено в C89, хотя это разрешено в C ++ и в 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;
       ...
    }
 }
1 голос
/ 31 января 2010

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

РЕДАКТИРОВАТЬ: Или попробуйте режим C ++, как предлагает akallio, хотя C и C ++ не являются строго совместимыми друг с другом, поэтому, если (например), вы используете какие-либо специфичные для C ++ ключевые слова в своем коде C, он выиграет ' т компиляция.

1 голос
/ 31 января 2010

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

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