我在尝试编译库(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();
行之上,则编译得很好。.cpp
而不是.c
),则编译正常。为什么会出现这种奇怪的错误?
我唯一的猜测是这是C的古老特征之一,其中所有变量都必须在函数的顶部声明。但我认为现代编译器比那更聪明。
答案 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;
}