Создание массива с константой - PullRequest
0 голосов
/ 20 марта 2010

Я работал над программой в Netbeans в Linux, используя компилятор gcc, когда при переключении на Visual C ++ в Windows 7 код не компилировался, так как Visual C ++ говорит, что expected constant expression в нескольких строках.В Netbeans я просто сделал что-то похожее на char name[fullName.size()];, а в Visual C ++ я попытался, между прочим,

const int position = fullName.size();
char Name[position];

Как создать константу для использования в массиве?

Примечание: я знаю о этом вопросе , но есть ли способ заставить это работать без использования векторов, поскольку для этого потребуется переписать многие части программы?

Ответы [ 4 ]

2 голосов
/ 20 марта 2010

Это невозможно в VC ++. Я знаю, довольно грустно: (

Решения включают в себя:

  • Создать его в куче
  • Сделать постоянным

Новый стандарт C ++ (C ++ 0x) предлагает функцию «константного выражения» для решения этой проблемы. Для получения дополнительной информации, проверьте это .

1 голос
/ 20 марта 2010

В VC ++ вы не можете делать во время выполнения объявления размеров массивов стека, но вы можете делать выделение стека с помощью _alloca

так вот:

const int position = fullName.size();
char Name[position];

становится таким:

const int position = fullName.size();
char * Name = (char*)_alloca(position * sizeof(char));

Это не совсем то же самое, но это так близко, как вы собираетесь получить в VC ++.

1 голос
/ 20 марта 2010

C ++ требует, чтобы размер массива был известен во время компиляции. Если вы не возражаете против использования нестандартного расширения, gcc разрешает код, который вы делаете (обратите внимание, что, хотя он не является стандартным C ++, он является стандартом в C на C99).

Я бы также предположил, что вы могли бы использовать вектор (в данном конкретном месте) с меньшими трудностями, чем вы думаете - хотя довольно много кода, написанного для массива, может работать с вектором только с повторной компиляцией и мало или совсем не переписывается.

0 голосов
/ 20 марта 2010

Ваш char name[fullName.size()]; является примером массива переменной длины , который, насколько я знаю, не стандартизирован в C ++, поэтому вы зависите от компилятора.[Немного не по теме, они являются частью стандарта C99]

...