为什么此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
dicking(用xyzabc替换它会产生相同的错误)。当我在我的IDE(Visual Studio Ultimate 2013)中鼠标悬停size_t
时,typedef unsigned int __w64 size_t
被定义为size_t
。
在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
。
我想我不想支持我想做的事。
答案 0 :(得分:6)
在C89模式下,数组大小必须是编译时常量,但size
不是一个。 const
关键字表示只读,而不是编译时间常量(这在C ++中是不同的)。所以你在这里几乎没有选择:
1)在支持VLA的C99模式下编译。
2)使用固定大小的数组:
char resultBufNative[64+1];
3)使用
#define size 64
这与选项(2)基本相同,只是预处理器替代了你。
4)按照bluepixy的建议使用enum
,这是一个与const
不同的编译时常量。
答案 1 :(得分:0)
更新的解决方案是在Visual Studio 2015中使用/ Tp编译为C ++。虽然不完美,但C ++编译器支持大部分C99。