为什么这是用Dev-C++编译器编译的,而不是visualstudio的?
为什么下面的代码要使用编译器和 不是用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(); }
#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));