Visual Studio 2008中奇怪的编译错误

编译以下代码时遇到问题:

#include  #include  int main () { printf("short: [%d,%d]\n",SHRT_MIN,SHRT_MAX); printf("int: [%d, %d]\n",INT_MIN, INT_MAX); printf("long: [%d, %d]\n",LONG_MIN,LONG_MAX); int aa=017; printf("%d\n",aa); return 0; } 

错误信息是:

 1>c:\tic\ex1\ex2\ex2.c(12) : error C2143: syntax error : missing ';' before 'type' 1>c:\tic\ex1\ex2\ex2.c(13) : error C2065: 'aa' : undeclared identifier 

但是,编译这个很好:

  #include  #include  int main () { int aa=017; printf("short: [%d,%d]\n",SHRT_MIN,SHRT_MAX); printf("int: [%d, %d]\n",INT_MIN, INT_MAX); printf("long: [%d, %d]\n",LONG_MIN,LONG_MAX); printf("%d\n",aa); return 0; } 

知道问题是什么吗?

在C中,在执行任何代码之前,必须先在范围的顶部声明变量。 在C99中不是这种情况(Visual Studio没有实现。)

Visual Studio不支持C99,因此块中的所有声明(例如示例中的aa )必须出现在任何语句之前(例如printf调用)。

在(旧)C中,您无法在C ++或最新的C标准中随意声明变量。 您必须在范围的开放大括号之后直接声明它,如第二个示例中所示。

在C99之前的C中,必须在该范围内的其他语句之前定义给定范围内的所有变量。 虽然它最初看起来一样,但这与GMan的答案并不完全相同。 特别是,函数可以包含定义其他作用域的其他块,并且可以在外部块中的可执行语句之后定义变量:

 int main() { int x; printf("whatever"); int y; // not allowed { int z; // allowed } return 0; } 

虽然像这样定义一个块(它与任何流控制没有关联,如if语句或while循环)是相当罕见的,但它允许作为C的一部分。

在“经典”C语言(C89 / 90)中,不允许在代码中间出现声明。 您原来的aa声明在C ++或“new”C(C99)中有效,但在C89 / 90中无效。

VS 2008附带了C89 / 90编译器,这就是您遇到这些错误的原因。

最重要的是,用于引用long值的正确printf格式说明符是%ld ,而不是%d

将文件类型更改为cpp然后它将工作(并且您可以将c ++添加到您的简历)

除非你明确告诉它编译为C,否则视觉工作室将.c文件编译为c ++无论如何? 你当然可以使用// commnets