C ++ WCHAR: невозможно выделить массив постоянного размера 0 - PullRequest
1 голос
/ 09 июня 2010

Я пытаюсь создать WCHAR:

LONG bufferSize = foo.bar() + 1;
WCHAR wszBaz[bufferSize];

Компилятор выдает ошибку:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'wszBaz' unknown size

Что я делаю не так?

ОБНОВЛЕНИЕ : я добавил const, но все равно выдает ту же ошибку:

const LONG bufferSize = foo.bar() + 1;
WCHAR wszBaz[bufferSize];

Ответы [ 4 ]

3 голосов
/ 09 июня 2010

Размер массива является константным выражением. bufferSize не является константным выражением.

Используйте vector: std::vector<WCHAR> wszBaz(bufferSize); или std::wstring.

0 голосов
/ 09 июня 2010

Размеры массива должны быть постоянным выражением:

const int foo = 10;
WCHAR array1[123]; // ok - 123 is a constant expression
WCHAR array2[foo + 10]; // ok too - the expression is constant
WCHAR array3[bar(123)]; // not ok - it may evaluate to the same thing every time, but function calls aren't seen as constant.

Обратите внимание, что const не делает что-то константным выражением. Константное выражение является чем-то постоянным во время компиляции. Компилятор достаточно умен, чтобы понять, что что-то вроде 5+5 является константным выражением, но не настолько умен, чтобы понять, что foo(5,5) является константным выражением - даже если foo(x,y) просто возвращает x+y.

В следующем стандарте C ++ (C ++ 0x) вы сможете определять функции как выражения const.

0 голосов
/ 09 июня 2010

Почему бы просто не использовать std::wstring?

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

std::wstring baz(bufferSize, ' ');

или вы можете использовать резервный метод:

std::wstring baz;
baz.reserver(bufferSize);
0 голосов
/ 09 июня 2010

Вы пытаетесь создать массив переменного размера в стеке.

Лучший способ сделать это - создать массив в куче следующим образом:

WCHAR* pszBaz = new WCHAR[bufferSize];

Затем вынужно помнить, чтобы удалить [], когда вы закончили с ним.

Еще проще, хотя просто использовать std :: wstring ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...