1、发现问题
最近用VS2010处理一段C代码时发现这样一类错误,源程序如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
fprintf(stdout, "Hello C\n");
for (int i = 0; i < 10; i++){
fprintf(stdout, "%dst Hello C\n", i);
}
getchar();
return 0;
}
编译时报错如下:
1> main.c
1>d:\vs_workspace\test\test\main.c(6): error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
1>d:\vs_workspace\test\test\main.c(6): error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
1>d:\vs_workspace\test\test\main.c(6): error C2143: 语法错误 : 缺少“)”(在“类型”的前面)
1>d:\vs_workspace\test\test\main.c(6): error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
1>d:\vs_workspace\test\test\main.c(6): error C2065: “i”: 未声明的标识符
1>d:\vs_workspace\test\test\main.c(6): warning C4552: “<”: 运算符不起任何作用;应输入带副作用的运算符
1>d:\vs_workspace\test\test\main.c(6): error C2065: “i”: 未声明的标识符
1>d:\vs_workspace\test\test\main.c(6): error C2059: 语法错误:“)”
1>d:\vs_workspace\test\test\main.c(6): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>d:\vs_workspace\test\test\main.c(7): error C2065: “i”: 未声明的标识符
1>
1>生成失败。
2、分析问题
一开始感觉莫名其妙,去网上查了下才知道,而VS2010的C编译器只支持C89标准,对C99标准支持不完全,而在C89标准中,变量需要放到函数体的前面声明,先声明再使用。
据说VS2013对C99的支持更完善了,已经可以随处声明变量。
现有的三种C语言标准:
- C89:89年发布,大部分编译器都很好的支持
- C99:99年发布,gcc很好的支持,微软不太感兴趣的样子
- C11:新平台也都开始支持
3、解决问题
方法一
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
int i;//在函数体前声明
fprintf(stdout, "Hello C\n");
for (i = 0; i < 10; i++){
fprintf(stdout, "%dst Hello C\n", i);
}
getchar();
return 0;
}
方法二
将 .c 文件改成 .cpp 文件