Pim*_*mgd 8 c compiler-errors constant-expression
为什么这个C代码在Visual Studio 2013 Ultimate中是非法的?
const unsigned int x = 64;
char resultBufNative[x+1];
Run Code Online (Sandbox Code Playgroud)
它给出了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;
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息: error C2057: expected constant expression
在线 char resultBufNative[size+1];
对我来说,这使得相关代码如下:
const size_t size = 64;
char resultBufNative[size+1];
Run Code Online (Sandbox Code Playgroud)
显然,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
Run Code Online (Sandbox Code Playgroud)
对于同一行代码.当然,这是因为它不知道是什么size + 1,所以它变成0.
运用
constexpr const size_t size = 64;
char resultBufNative[size+1];
Run Code Online (Sandbox Code Playgroud)
给error C2065: 'constexpr' : undeclared identifier.
运用
const size_t size = 65;
char resultBufNative[size];
Run Code Online (Sandbox Code Playgroud)
给error C2057: expected constant expression.
运用
static const size_t size = 64;
char resultBufNative[size+1];
Run Code Online (Sandbox Code Playgroud)
给error C2057: expected constant expression.
运用
const unsigned int x = 64;
char resultBufNative[x+1];
Run Code Online (Sandbox Code Playgroud)
给error C2057: expected constant expression.
我想我不想支持.
在C89模式下,数组大小必须是编译时常量,但size不是一个.const关键字意味着只读,而不是编译时间常量(这在C++中是不同的).所以你在这里几乎没有选择:
1)在支持VLA的C99模式下编译.
2)使用固定大小的数组:
char resultBufNative[64+1];
Run Code Online (Sandbox Code Playgroud)
3)使用
#define size 64
Run Code Online (Sandbox Code Playgroud)
这与选项(2)基本相同,只是预处理器为您替换.
4)enum按照bluepixy的建议使用,这是一个不同的编译时常量const.