为什么使用Dev-C ++编译器而不是Visual Studio编译器?

时间:2009-11-19 20:39:29

标签: c visual-studio dev-c++

为什么以下代码使用Dev-C++编译器进行编译 不是用Visual Studio?

有什么想法吗?这是代码:

#include<stdio.h>
main(){
    int n,i;
    scanf("%d",&n);
    int arr[n];
    for(i= 0 ; i <n ; i++)
    {
         //Do something with the array 
    }
    fflush(stdin);
    getchar();
}

以下是错误:

Errors http://img688.imageshack.us/img688/6618/26863513.jpg

5 个答案:

答案 0 :(得分:6)

此:

int arr[n];

无效,因为n不是常量表达式。您需要使用malloc在堆上分配可变大小的数组(然后在完成free时释放它们。)

如果您尝试使用.cpp扩展程序对其进行编译,main的返回类型必须为int。如果您尝试使用.c扩展名编译它,那么您需要使用c样式的局部变量声明并在函数顶部声明所有局部变量。

答案 1 :(得分:4)

Visual C ++不会使用该语法进行堆栈分配(尽管我希望它能做到)。您可以使用以下命令显式堆栈分配:

int *arr = (int *)_alloca(n*sizeof(*arr));

并且无需释放它,因为当范围结束时它会自动释放。

答案 2 :(得分:3)

这不是有效的C ++ - Visual C ++编译器包含最新的C编译器(而不是C ++的C子集),特别是它不实现C99或任何更新的东西。您的代码使用Visual C ++编译器不知道的功能(int arr[n])。

答案 3 :(得分:1)

简化你得到的答案:

您的代码是C99,Visual C ++仅支持C89。帮自己一个忙,为Windows获得更好的编译器。英特尔编译器对C99的支持远远超过微软编译器(没有编译器)。

答案 4 :(得分:0)

您的计划不是符合标准的计划。

在尝试编译时,需要任何符合标准的编译器来发出诊断信息。

如果Dev-C ++在没有警告的情况下编译它,则在非合规模式下调用编译器。

除了必需的诊断之外,兼容的编译器可以尝试编译或者只是简单地中止编译。

main()

在C89中,这是有效的,不需要诊断,在C99中,这是无效的,需要诊断(有效的C99定义为int main(void)int main(int argc, char **argv)或等效)...所以如果您使用的是兼容编译器它是一个C89编译器。

scanf("%d",&n);
int arr[n];

糟糕,这在C89中无效。在C89中,您不能将代码与声明混合在一起。 C89编译器在看到数组声明时必须发出诊断信息。

所以......你正在以不合规的方式使用你的编译器。没有办法说出为什么编译或编译失败。