Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这是用Dev-C++编译器编译的,而不是visualstudio的?_C_Visual Studio_Dev C++ - Fatal编程技术网

为什么这是用Dev-C++编译器编译的,而不是visualstudio的?

为什么这是用Dev-C++编译器编译的,而不是visualstudio的?,c,visual-studio,dev-c++,C,Visual Studio,Dev C++,为什么下面的代码要使用编译器和 不是用VisualStudio吗 有什么想法吗?代码如下: #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(); }

为什么下面的代码要使用编译器和 不是用VisualStudio吗

有什么想法吗?代码如下:

#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();
}
以下是错误:

这:

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


如果您尝试使用.cpp扩展名编译此文件,main必须具有int的返回类型。如果您尝试使用.c扩展名编译此文件,然后,你需要使用C风格的局部变量声明,并在函数的顶部声明所有的局部变量。

< P>这是无效的C++。Visual C++编译器不包含最新的C编译器而不是C++的C子集,特别是它不实现C99或任何更新的东西。您的代码使用VisualC++编译器不知道int ARR [n]。

的功能。您的程序不是标准兼容程序。

任何符合标准的编译器在尝试编译时都需要发出诊断

如果Dev-C++在没有警告的情况下编译了它,则编译器将在非遵从性模式下调用

除了所需的诊断之外,兼容编译器可以尝试无论如何编译,或者干脆中止编译

main()
在C89中,这是有效的,不需要诊断;在C99中,这是无效的,需要诊断。有效的C99定义为int mainvoid或int mainint argc、char**argv或等效定义。。。因此,如果您使用的是兼容编译器,那么它就是C89编译器

scanf("%d",&n);
int arr[n];
哎呀,这在C89中是无效的。在C89中,不能将代码与声明混合。C89编译器在看到数组声明时必须发出诊断


所以。。。您正在以不一致的方式使用编译器。没有办法告诉它编译或编译失败的原因。

VisualC++不使用该语法进行堆栈分配,虽然我希望它能做到。您可以通过以下方式显式执行堆栈分配:

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

无需释放它,因为当作用域结束时它会自动释放。

要简化您得到的答案:


<>你的代码是C99,Visual C++只支持C89。帮你自己一个忙,找一个更好的Windows编译器。英特尔编译器比微软编译器对C99的支持要好得多,微软编译器没有。

提到您遇到的编译错误将有助于我们解释这些错误。您的编译错误可能与行号有关。错误3和4是显而易见的,但我不知道错误2从何而来,问题是错误1是什么。错误2来自于一个事实,即在C89中,所有声明必须在任何其他语句之前位于函数顶部。arr必须在前面的scanf行之前声明。arr[n]可能是您的问题。Dev-C++使用的GCC对C99可变长度数组具有初步支持,但Visual Studio的编译器不支持,因此编译失败。此外,在C89中,使用非整数常量声明数组是无效的。在C++中,用常数积分表达式声明数组是合法的,但这不是运行时发生的n值,VisualStudio很可能会在这里使用C++标准。以及福鲁斯特丁;,它在标准*中未定义,并且在main中缺少return语句。。。并且在使用变量之前不检查scanf的返回值。*某些编译器将刷新输入流定义为扩展
int *arr = (int *)_alloca(n*sizeof(*arr));