const变量不能用在常量表达式中?

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.

我想我不想支持.

P.P*_*.P. 6

在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.