我在Visual Studio 2010中编写C语言。编译器似乎不想让我使用内联变量声明。以下代码产生错误:
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:语法错误:丢失 ';'在'type'之前
错误C2143:语法错误:丢失 ';'在'type'之前
错误C2143:语法错误:丢失 ';'在'type'之前
为什么会这样?是否有设置使编译器不那么严格?
答案 0 :(得分:10)
在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 :(得分:1)
尝试将其编译为C ++。 C99将允许声明变量而不是作用域的顶部,但VC不知道C99。
答案 2 :(得分:1)
内联变量声明仅在符合C99的编译器中受支持。 Microsoft Visual C ++似乎不符合C99(ref)。您将要么必须使用符合C99的编译器(GCC将在与-std=c99
一起使用时使用内联变量编译代码)或在函数顶部声明您的变量。
编辑:或者按照akallio的建议尝试C ++模式,尽管C和C ++之间没有严格的兼容性,所以如果(例如),你在C代码中使用任何特定于C ++的关键字,它就赢了“编译。