1

私は構造を持っています

typedef struct lzma_next_coder_s lzma_next_coder;

struct lzma_next_coder_s {
lzma_coder *coder;
lzma_vli id;
uintptr_t init;
lzma_code_function code;
lzma_end_function end;
lzma_check (*get_check)(const lzma_coder *coder);
lzma_ret (*memconfig)(lzma_coder *coder, uint64_t *memusage,
        uint64_t *old_memlimit, uint64_t new_memlimit);
lzma_ret (*update)(lzma_coder *coder, lzma_allocator *allocator,
        const lzma_filter *filters,
        const lzma_filter *reversed_filters);
};

以下はマクロです。

#define LZMA_NEXT_CODER_INIT \
(lzma_next_coder){ \
    .coder = NULL, \
    .init = (uintptr_t)(NULL), \
    .id = LZMA_VLI_UNKNOWN, \
    .code = NULL, \
    .end = NULL, \
    .get_check = NULL, \
    .memconfig = NULL, \
    .update = NULL, \
}

これがコールです

lzma_next_coder *next;

next = LZMA_NEXT_CODER_INIT; line 210.

主な目的は、next構造体を NULL で初期化することです。

しかし、私は210行目で取得error C2059: syntax error : '{'していますerror C2143: syntax error : missing ';' before '{'

Visual Studio 2010 を使用してコンパイルしています。.coder=NULLVS はスタイル構文を認識しないと思います。このように構造体メンバーを NULL で初期化する関数 (マクロの代わりに) も作成しました。

lzma_next_coder make_null_lzma()
{
lzma_next_coder temp;
temp.coder = NULL;
    //other members
    return temp;
}
next = make_null_lzma();

エラーはなくなりましたが、ランタイム クラッシュが発生しています。私はそれを正しくやっていますか?next は本当に NULL で初期化されていますか? それとも私はそれを台無しにしましたか?

ありがとう

4

2 に答える 2

4

エラー メッセージは、MSVC からのものであるかのようにフォーマットされています。MSVC は C99 をサポートしていません。使用しているコンストラクトは C99 であり、MSVC がすべてサポートしている C89 ではありません。

C99 コンパイラ (Cygwin や MinGW などの GCC コンパイラの使用を提案) を見つけるか、複合リテラルと指定された初期化子の利便性を放棄する必要があります。

関数バージョンは正常に動作するはずです。初期化された構造体を出力することで、すべてを初期化したことを確認できます。関数定義と への代入での使用の間に他のコードがあると仮定していますtemp

于 2013-03-15T06:41:02.000 に答える
2

基本的な問題は、構造体へのポインタLZMA_NEXT_CODER_INITであるのに対し、構造体の初期化に使用されることです。NULL に初期化するには、次のようにします。next

next = NULL

さらに、Visual Studio ではサポートされていない C99 で導入されたため、Visual C++ はこの種の初期化をサポートしません。この制限を回避するには、マクロを C90 スタイルの初期化に置き換えることができます。

#define LZMA_NEXT_CODER_INIT \
{ \
    NULL, \
    LZMA_VLI_UNKNOWN, \
    (uintptr_t)(NULL), \
    NULL, \
    NULL, \
    NULL, \
    NULL, \
    NULL, \
}

構造体の順序に合わせてフィールドが再配置されていることに注意してください。

編集:これは、構造体を初期化するときにのみ機能します。既存の構造体に割り当てたい場合は、一時的な構造体を作成して古い構造体に割り当てることができます。例えば:

{
  tmp lzma_next_coder_s tmp = LZMA_NEXT_CODER_INIT;
  old = tmp;
}
于 2013-03-15T06:42:33.487 に答える