我尝试在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];
}
此行适用于g ++版本,但在Visual Studio中不起作用。 它会引发以下错误:
1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2057: expected constant expression
1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2466: cannot allocate an array of constant size 0
1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2133: 'arr' : unknown size
这是一个有效的陈述吗?两个编译器如何对同一个语言有不同的解释
答案 0 :(得分:14)
这是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];
答案 1 :(得分:9)
所有编译器都以微妙的方式实现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
答案 2 :(得分:3)
尝试将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),非类型模板参数 积分或枚举类型,和 sizeof表达式。浮动文字 (2.13.3)只有在出现时才会出现 强制转换为整数或枚举类型。 只输入转换为积分或 可以使用枚举类型。在 特别是,除了sizeof 表达式,函数,类对象, 指针或引用不得 使用,分配,增量, 递减,函数调用或逗号 不得使用运营商。
int a = 100
不是常量表达式。
答案 3 :(得分:1)
在microsoft c ++中,创建在堆栈编译时无法确定其大小的数组是无效的。 您必须在堆上创建数组或使用常量来指定数组大小。
char *arr = new char[size];
const int size2 = 100;
char arr2[size2];