error C2143: syntax error : missing ';' before ...

今天偶然寫了下面的程序(原來我寫的程序不同,下面的只是爲了把問題簡化)
void foo()
{
    int p = 0;
    if ( p == 0 ) {
        int i = 0;
    }
 
    int a;
}
 
int main()
{
    foo();
}
 
不幸的是偶然將這個文件保存成了test.c
而後編譯的時候出現了
error, error C2143: syntax error : missing ';' before 'type'
感受很奇怪,細細看來全部的語法都彷佛都是對的,更奇怪的是把文件改爲cpp或者cc能正常編譯,把int a;和if調換下也能正常編譯。
google了下獲得了答案和總結以下:
 
來自MSDN (http://support.microsoft.com/kb/58559):
這樣的錯誤可能發生在當變量的聲明放在可執行代碼以後。而這個是在K&R C中規定的,但在ANSI C中廢除。
MSDN給出下面的代碼會產生這個error
#include <stdio.h>
 
void main(void)
{
   int i;
   printf("Hello World/n");
   int j;
}
 
注: The C Programming Language的做者簡稱K&R,也是C語言之父, 常常用K&R C來和ANSI C作對比。這本書的第二版已經用ANSI.
我用的編譯器是VS2008, 看來微軟向來無視標準。
 
總結:
在 ANSI C或者C++中,在可執行代碼中隨時定義變量是容許的,可是在K&R C中是不容許的,VS2008實現的C居然是K&R C。
注意這樣的錯誤也體如今VS中要是用for (int i = 0; i++; i<10)同時你的文件名是.c的也會出現這樣的錯誤。

Code complete中討論過變量名的最遲綁定有利於增長代碼的可讀性等。因此在VS中寫c要注意了。 google

這是由於:在 ANSI C 或者 C++中,在可執行代碼中隨時定義變量是容許的,可是在K&R C中是不容許的,所以纔會出現這個錯誤。VC6.0 、VS2008 都是用的 K&R C 來實現 C語言的,所以編譯過程當中會報錯。 spa