【问题标题】:Microsoft C Compiler: Inline variable declaration?Microsoft C 编译器:内联变量声明?
【发布时间】:2011-01-11 08:06:38
【问题描述】:

我在 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:语法错误:缺失 ';'在“类型”之前

错误 C2143:语法错误:缺失 ';'在“类型”之前

错误 C2143:语法错误:缺失 ';'在“类型”之前

为什么会这样?有没有设置让编译器不那么严格?

【问题讨论】:

    标签: c syntax variables


    【解决方案1】:

    尝试将其编译为 C++。 C99 将允许在范围顶部以外声明变量,但 VC 不知道 C99。

    【讨论】:

    【解决方案2】:

    仅在符合 C99 的编译器中支持内联变量声明。 Microsoft Visual C++ 似乎不符合 C99 (ref)。您要么必须使用符合 C99 的编译器(当与 -std=c99 一起使用时,GCC 将使用内联变量编译代码)或在函数顶部声明您的变量。

    编辑:或者按照 akallio 的建议尝试 C++ 模式,尽管 C 和 C++ 彼此并不严格兼容,所以如果(例如)您在 C 代码中使用任何 C++ 特定的关键字,它不会t 编译。

    【讨论】:

    • 关键字除外,关于指针转换和enum/struct/union命名空间的不同规则也会使安全的C代码无法在C++模式下编译。还有其他花絮,例如 C 中的 sizeof('a')==sizeof(int) 和 C++ 中的 sizeof('a')==sizeof(char),但实际上这并不是问题的常见原因。
    【解决方案3】:

    在 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;
           ...
        }
     }
    

    【讨论】:

    • 虽然有点乱,不是吗?引用这些变量的所有其余函数都必须在块内,以便变量不会超出范围。如果过度使用,这将导致 非常 混乱和大括号的代码。
    • @Chinmay:这取决于。是的,它对于大块可能会变得混乱,但它对于一些变量只需要非常有限范围的小块也很有用。
    • 便携性如何?这似乎是在自找麻烦。
    • @JoelB:它是标准的 C89,所以它应该是完全可移植的。
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多