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

时间:2014-11-12 09:57:34

标签: c compiler-errors constant-expression

为什么此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

我想我不想支持我想做的事。

2 个答案:

答案 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。