Различия в компиляторе C++ (VS2008 и g ++)

Нет, я - тяжелое Знаток пользователь и использую Q для плагина Eclipse, который создает и сохраняет .project и .classpath обновленными. Для других вещей, таких как настройки для плагинов я обычно поддерживаю README или страницу Wiki об этом.

Также те я работал с этим, предпочитают, чтобы другие IDE просто использовали плагины Знатока для генерации файлов, должен был сохранить их IDE (и они) счастливый.

6
задан tomkaith13 14 December 2009 в 12:33
поделиться

4 ответа

Это функция 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];
14
ответ дан 8 December 2019 в 03:53
поделиться

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

char *arr = new char[size];
const int size2 = 100;
char arr2[size2];
1
ответ дан 8 December 2019 в 03:53
поделиться

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

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

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

3
ответ дан 8 December 2019 в 03:53
поделиться

Все компиляторы реализуют стандарт C++ тонко разными способами. Однако, проблемы, которые возникают с g++, заключаются в том, что по умолчанию он включает множество расширений языка. Для получения предупреждений об этом необходимо всегда компилировать по крайней мере с -Wall и -педантичными флагами:

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
9
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: