简单代码的意外编译错误

时间:2011-09-09 01:59:11

标签: c visual-c++

我在尝试编译库(flextGL)时遇到了一个奇怪的编译错误(使用VC2010),这对我来说毫无意义。

考虑以下最小C示例(test.c):

void a()
{
    // ...
}

int b()
{
    a();

    int c;

    return 0;
}

如果我尝试在VC2010下编译它,我会收到以下错误:

test.c(10) : error C2143: syntax error : missing ';' before 'type'

错误是指int c;行。

经过一些实验,我发现了以下内容:

  • 如果我删除int c;行,则编译正常。
  • 如果我删除a();行,则编译正常。
  • 如果我将int c;行移到a();行之上,则编译得很好。
  • 如果我将要编译的文件重命名为C ++而不是C(.cpp而不是.c),则编译正常。

为什么会出现这种奇怪的错误?

我唯一的猜测是这是C的古老特征之一,其中所有变量都必须在函数的顶部声明。但我认为现代编译器比那更聪明。

5 个答案:

答案 0 :(得分:5)

你的猜测是正确的。

您在块中的非变量声明后声明了一个变量。 Visual C ++不实现C99,而只实现ANSI C,因此无法编译。

答案 1 :(得分:4)

VC2010附带的C编译器来自该标准的旧版本,其中变量只能在范围的顶部声明。

答案 2 :(得分:1)

因为您正在使用Visual C ++进行编译,而Microsoft不支持C99。它支持C89,这意味着你必须在范围的顶部声明所有变量。

答案 3 :(得分:1)

启用gcc和警告后,我得到:

gcc -Wall --pedantic foo.c -c 
foo.c:3:5: warning: C++ style comments are not allowed in ISO C90
foo.c:3:5: warning: (this will be reported only once per input file)
foo.c: In function ‘b’:
foo.c:10: warning: ISO C90 forbids mixed declarations and code
foo.c:10: warning: unused variable ‘c’

也许您应该为编译器启用所有警告,以获取更多信息。

答案 4 :(得分:0)

在C中,所有变量都需要在块的开头声明。变量的内存(在您的情况下为4个字节)在您输入新函数时会添加到堆栈中,并在退出函数时被删除。

如果你需要在其他地方声明一个变量,你总是可以使用这样的内联函数。

int b()  
{  
   a();  

   {
   int c;  
   }

   return 0;  
}