постоянная проблема в VS2010 - PullRequest
3 голосов
/ 26 июня 2011

У меня самый короткий вопрос:

Почему это не работает в VS2010?

string keyword("lookuptable");
const int kwSize = keyword.size();
char oldBuffer[kwSize+1];

Отлично работает в GCC. VS2010 говорит мне, что

"выражение должно иметь постоянное значение"

Я использую консольное приложение Win32 / пустой проект.

Я использую абсолютно ничего особенного, просто

#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <string.h> 
using namespace std

и его единственная основная функция в файле cpp.

Ответы [ 5 ]

2 голосов
/ 26 июня 2011

GCC имеет расширение языка, допускающее использование массивов переменной длины. Visual C ++ не делает. Вы должны инициализировать основанные на стеке массивы с фиксированной постоянной времени компиляции.

2 голосов
/ 26 июня 2011

Размер массива должен быть целочисленным константным выражением или ICE (что означает, что он должен быть известен во время компиляции). Вы можете использовать const int в ICE, но только если его инициализатор сам является ICE.

Вызов функции, такой как keyword.size(), не может использоваться в ICE, поэтому kwSize не может использоваться в ICE.

Если в «gcc» он работает «отлично», то это либо из-за ошибки, либо из-за какого-либо расширения языка.

В C ++ 0x некоторые вызовы функций могут использоваться в целочисленных константных выражениях, но они должны быть constexpr функциями и существуют ограничения на их использование. Насколько мне известно, ни один компилятор пока полностью не поддерживает constexpr. В любом случае std::string::size не является constexpr.

1 голос
/ 26 июня 2011

Как уже упоминалось, неконстантные границы массивов являются расширением GCC (вероятно, побочным преимуществом его поддержки C99 - C99 допускает неконстантные границы массивов). Если вы хотите это в C ++, вы должны использовать vector:

std::vector oldBuffer(kwSize + 1);

Чтобы превратить это в char *, выполните:

&oldBuffer[0]

Это, строго говоря, недопустимый C ++ до C ++ 0x, работает должным образом в каждом компиляторе, с которым я сталкивался до сих пор. C ++ 0x задним числом благословляет это использование, а также обеспечивает oldBuffer.data() эквивалент.

0 голосов
/ 26 июня 2011

ответ там "выражение должно иметь постоянное значение".Const должен быть разрешен во время компиляции.

0 голосов
/ 26 июня 2011

keyword.size() вычисляется во время выполнения, поэтому это не постоянная времени компиляции.В зависимости от компилятора может быть запрещено использовать размер массива, который зависит от некоторого значения времени выполнения.

Некоторая дополнительная информация о переменной длины массива в gcc

...