Microsoft C编译器:内联变量声明?

时间:2010-01-31 02:42:40

标签: c syntax variables

我在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'之前

为什么会这样?是否有设置使编译器不那么严格?

3 个答案:

答案 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 ++的关键字,它就赢了“编译。