Отличия компилятора C ++ (VS2008 и g ++) - PullRequest
6 голосов
/ 14 декабря 2009

Я попытался скомпилировать следующий код в 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

Это правильное утверждение? Как два компилятора могут по-разному интерпретировать один и тот же язык

Ответы [ 4 ]

14 голосов
/ 14 декабря 2009

Это особенность 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];
9 голосов
/ 14 декабря 2009

Все компиляторы реализуют стандарт 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
3 голосов
/ 14 декабря 2009

Попробуйте изменить int a на const int a. Стандарт C ++ гласит, что размер массивов должен быть постоянным выражением. Определение постоянного выражения (5.19.1):

В некоторых местах C ++ требует выражения, которые оценивают интеграл или константа перечисления: как границы массива (8.3.4, 5.3.4), в зависимости от случая выражения (6.4.2) в виде битового поля длины (9.6), как перечислитель инициализаторы (7.2), как статический член инициализаторы (9.4.2), а так же интегральные или перечисление не тип шаблона аргументы (14.3). константа-выражение: условное выражение Интеграл константное выражение может включать только литералы (2.13), перечислители, const переменные или статические члены данных целочисленные или перечислимые типы инициализируется с помощью константных выражений (8.5), нетипичные параметры шаблона целочисленные или перечислимые типы, и Размер выражений. Плавающие литералы (2.13.3) могут появляться только если они приведение к целочисленным или перечислимым типам. Только преобразования типа в целое или типы перечисления могут быть использованы. В в частности, кроме размера выражения, функции, объекты класса, указатели или ссылки не должны быть используется и присваивание, приращение, декремент, вызов функции или запятая операторы не должны использоваться.

int a = 100 не является константным выражением согласно этому определению.

1 голос
/ 14 декабря 2009

в Microsoft C ++, недопустимо создавать массив, размер которого не может быть определен во время компиляции в стеке. Вы должны либо создать массив в куче, либо использовать константу для указания размера массива.

char *arr = new char[size];
const int size2 = 100;
char arr2[size2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...