C++ C++;编译器差异(VS2008和g+;+;)
我尝试在Linux和VS 2008中编译以下代码: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
#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