Компилятор 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 компилировать.