Я пишу 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: синтаксическая ошибка: пропавшие без вести''; перед 'типом'
Почему это происходит? Существует ли установка для создания компилятора не настолько строгим?
Установка деклараций после не-деклараций не допускается в 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;
...
}
}
Попробуйте скомпилировать его как C ++. C99 позволит объявлять переменные, кроме вершины объема, но VC не знает о C99.
Inline-объявления переменных поддерживаются только в C99-совместимом компиляторе. Microsoft Visual C++, похоже, не поддерживает C99 (ref). Вам либо придется использовать C99-совместимый компилятор (GCC скомпилирует код со встроенными переменными при использовании с -std=c99
), либо объявить свои переменные в верхней части функции.
EDIT: Или попробуйте режим C++, как предлагает akallio, хотя C и C++ не являются строго совместимыми друг с другом, так что если (например) вы используете в вашем C-коде какие-либо специфические для C++ ключевые слова, то он не будет компилироваться.