Защо този C код е незаконен в Visual Studio 2013 Ultimate?
const unsigned int x = 64;
char resultBufNative[x+1];
Това дава error C2057: expected constant expression
.
Оригинален въпрос
Напълно съм объркан от този.
Съответна функция:
jstring Java_com_nabto_api_NabtoCApiWrapper_nabtoGetSessionToken(JNIEnv* env, jclass thiz, jobject sessionObj)
{
const size_t size = 64;
char resultBufNative[size+1];
size_t resultLen;
//Get the session
nabto_handle_t session;
session = (nabto_handle_t) (*env)->GetDirectBufferAddress(env, sessionObj);
nabto_status_t nabtoStatus = nabtoGetSessionToken(session, resultBufNative, size, &resultLen);
if (nabtoStatus == NABTO_OK && resultLen <= size) {
// Terminate char array, convert to java string, free buffer and return result
resultBufNative[resultLen] = 0;
jstring result = (*env)->NewStringUTF(env, resultBufNative);
//nabtoFree(resultBufNative);
return result;
}
else {
return NULL;
}
}
Съобщение за грешка: error C2057: expected constant expression
На линия char resultBufNative[size+1];
За мен това прави съответния код като такъв:
const size_t size = 64;
char resultBufNative[size+1];
И очевидно const size_t + 1
не е постоянен израз.
Няма дефиниции или макроси, за които size
се бърка (замяната му с xyzabc дава същата грешка). size_t
се определя като typedef unsigned int __w64 size_t
, когато преместя курсора на мишката над size_t
в моята IDE (Visual Studio Ultimate 2013).
След C2057 очакваната постоянна грешка в израза, компилаторът дава още 2 грешки:
C24166: cannot allocate array of size 0
C2133: 'resultBufNative': unknown size
За същия ред код. Естествено, това е така, защото не знае какво е size + 1
, така че става 0.
Използвайки
constexpr const size_t size = 64;
char resultBufNative[size+1];
Дава error C2065: 'constexpr' : undeclared identifier
.
Използвайки
const size_t size = 65;
char resultBufNative[size];
Дава error C2057: expected constant expression
.
Използвайки
static const size_t size = 64;
char resultBufNative[size+1];
Дава error C2057: expected constant expression
.
Използвайки
const unsigned int x = 64;
char resultBufNative[x+1];
Дава error C2057: expected constant expression
.
Предполагам, че това, което искам да направя, не се поддържа.
constexpr const size_t size = 64
- person leemes   schedule 12.11.2014static const
илиconstexpr
- person Tony Delroy   schedule 12.11.2014constexpr const size_t size = 64
даваC2065: 'constexpr' unknown identifier
- person Pimgd   schedule 12.11.2014static const
, както е предложено от @TonyD. О, и не се нуждаете от и дветеconstexpr
иconst
. - person Some programmer dude   schedule 12.11.2014const unsigned int x = 64
не? - person Pimgd   schedule 12.11.2014x
не е константа, защото е променлива в C. VS2013 не поддържа VLA. - person BLUEPIXY   schedule 12.11.2014