C++ C++;编译器差异(VS2008和g+;+;)

C++ C++;编译器差异(VS2008和g+;+;),c++,compiler-errors,C++,Compiler Errors,我尝试在Linux和VS 2008中编译以下代码: #include <iostream> // this line has a ".h" string attached to the iostream string in the linux version of the code using namespace std; // this line is commented in the linux version of the code void main() { int

我尝试在Linux和VS 2008中编译以下代码:

#include <iostream> //  this line has a ".h" string attached to the iostream string in the linux version of the code
using namespace std; // this line is commented in the linux version of the code
void main()
{

  int a=100;
  char arr[a];

  arr[0]='a';
  cout<<"array is:"<<arr[0];

}
这是一个有效的声明吗??两个编译器如何对同一语言有不同的解释这是C99的特点:

char arr[a]; // VLA: Variable Length Arrays (C99) but not C++!
<> GCC支持C99的许多特性,但VC不这样做,我认为它不会在不久的将来,因为他们越来越专注于C++。无论如何,您可以将声明更改为:

  const int a=100; // OK the size is const now!
  char arr[a];

微软C++中,在堆栈编译时不能创建大小不能确定的数组是无效的。 您必须在堆上创建数组,或者使用常量指定数组大小

char *arr = new char[size];
const int size2 = 100;
char arr2[size2];

尝试将
int a
更改为
const int a
。C++标准声明数组的大小应该是常量表达式。常数表达式的定义为(5.19.1):

在一些地方,C++需要 计算结果为 积分或枚举常数:as 数组边界(8.3.4、5.3.4),视情况而定 表达式(6.4.2),作为位字段 长度(9.6),作为枚举数 初始值设定项(7.2),作为静态成员 初始值设定项(9.4.2),以及 或枚举非类型模板 论点(14.3)。常量表达式: 积分的条件表达式 常量表达式只能包含 文字(2.13),枚举数,常量 的变量或静态数据成员 整型或枚举型 用常量表达式初始化 (8.5),非类型模板参数 整型或枚举类型,以及 表达式的大小。浮动文字 (2.13.3)只有在以下情况下才能出现: 强制转换为整型或枚举类型。 仅将类型转换为整型或 可以使用枚举类型。在里面 特别说明,尺寸除外 表达式、函数、类对象、, 不得使用指针或引用 使用、赋值、增量、, 减量、函数调用或逗号 不得使用操作员


<代码> int A=100 < /COD>不是根据这个定义的常量表达式。

< P>所有编译器以细微不同的方式实现C++标准。但是,使用g++所遇到的问题是,默认情况下,它支持许多语言扩展。要获取有关这些的警告,您应该始终至少使用-Wall和-pedantic标志进行编译:

g++ -Wall -pedantic myfile.cpp
将出现以下错误/警告:

myfile.cpp:1:119: error: iostream.h: No such file or directory
myfile.cpp:2: error: '::main' must return 'int'
myfile.cpp: In function 'int main()':
myfile.cpp:6: warning: ISO C++ forbids variable length array 'arr'
myfile.cpp:9: error: 'cout' was not declared in this scope

在Visual Studio中使用编译器的设置是什么?默认是微软Visual C++。然而,GCC编译ISO C++。它们不一样——微软在C++中的实现中有些东西在ISO C++中是非法的,反之亦然。@托马斯:那么有没有办法将它改为ISO C++设置?我想修改为一台机器编写的代码,以便在另一台机器上工作。至少不涉及系统调用的G+ +默认不使用ISO C++,它使用ISO和GNU扩展。如果您想要标准C++,请使用-PANANDIC标记(然后VLA将在GCC上失败,因为它是非标准的)。要在VisualStudio中获得标准C++,请避免在名称中使用任何“CLR”的项目类型,并使用/ZA选项禁用扩展。我不认为这与微软有关。在标准C++中,这是不正确的。请参阅尼尔的答案,为GCC允许的更多细节。你的意思是他们集中在C++?编译器通常被称为Visual C++。C++从C++中分叉,所以C++编译器很容易为传统C代码提供C89模式。但是,支持C99的工作还很多,VLAs的C99特性不是标准C++的一部分,甚至是C++的0x,所以MS不支持TEM,IMHO。注意MSVC的代码< AlelaCa < /C> >与GLYBC的<代码> AlOLCA</代码>相比较,这样您就可以得到一个有效的多平台替换,并带有一点宏魔术。不确定其他主要操作系统/体系结构上有什么可用。FWIW,建议的解决方案(const int a)在VS2013中不再适用:(即使没有-Wall或-pedantic,我也会收到一条警告,X.h标头已被弃用,正如您所预料的,由于该版本使用的是全局名称空间而不是std,因此会出现I get the cout not defined错误。
myfile.cpp:1:119: error: iostream.h: No such file or directory
myfile.cpp:2: error: '::main' must return 'int'
myfile.cpp: In function 'int main()':
myfile.cpp:6: warning: ISO C++ forbids variable length array 'arr'
myfile.cpp:9: error: 'cout' was not declared in this scope