9

Visual Studio 2013 Ultimate でこの C コードが違法なのはなぜですか?

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に置き換えると同じエラーが発生します)。IDE(Visual Studio Ultimate 2013)でマウスオーバーしたときsize_tと定義されています。typedef unsigned int __w64 size_tsize_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ます。

私がやりたいことはサポートされていないと思います。

4

2 に答える 2

6

C89 モードでは、配列サイズはコンパイル時の定数でなければなりませんが、size1 ではありません。constキーワードは、コンパイル時定数ではなく、読み取り専用を意味します (これは C++ では異なります)。したがって、ここにはいくつかのオプションがあります。

1) VLA をサポートする C99 モードでコンパイルします。

2) 固定サイズの配列を使用します。

   char resultBufNative[64+1];

3) 使用

#define size 64

これは基本的にオプション (2) と同じですが、プリプロセッサがその代わりを行います。

4)enumとは異なり、コンパイル時定数である bluepixy によって提案されているように使用しますconst

于 2014-11-12T10:32:43.193 に答える
-1

A updated solution is to compile as C++ using /Tp in Visual Studio 2015. 完全ではありませんが、C++ コンパイラは C99 の大規模なサブセットをサポートしています。

于 2015-12-01T18:11:44.647 に答える