2

コードスニペットでポインターの配列を定義する際に問題がありconst void *ます-VisualC++は、私が試した組み合わせについて文句を言います:

void *call_func_cdecl(void *func, const void *const *args, int nargs);

void vlogprintf(const char *format, va_list va) {
    int nargs;
    void **args;

    args = malloc(...);

    args[0] = format;
    // fill the rest...

    call_func_cdecl((void*)logprintf, args, nargs);
    free(args);
}

ご存知freevoid *ように、配列自体は一定ではありませんが、その要素formatはaconst void *であり、の要素である必要がありargsます。

これまで私はこれらを試しました:

  • const void **args

    ラインに着きwarning C4090: 'function' : different 'const' qualifiersましたfree(args)

  • void const **args

    同上

  • void *const *args

    ラインに着きerror C2166: l-value specifies const objectましたargs[0] = format

  • void **const args

    同上

4

2 に答える 2

3

単純な malloc で const ポインターの配列を割り当てる方法はありません。基本的なタイプはそれらが何であるかであり、何をしているのかを知っていれば、(多かれ少なかれ) これらのエラーを安全に無視できます。「正しい」方法で実行したい場合は、次のようなことを試すことができます (コードは実際に使用する順序ではなく、ランダムなスニペットのみです)。

struct constvoid {
 const void * ptr;
}

void *call_func_cdecl(void *func, struct constvoid *args, int nargs);

{
    struct constvoid* args = malloc(...);

    args[0].ptr = format;
    //fill the other

    call_func_cdecl((void*)logprintf, args, nargs);
    free(args);
}
于 2013-01-14T11:32:34.407 に答える
2

正解です:

void const** args

警告はバグだと思います。

于 2013-01-14T11:02:39.433 に答える