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 初始化结构。

但我在第 210error C2059: syntax error : '{'error C2143: syntax error : missing ';' before '{'

我正在使用 Visual Studio 2010 进行编译。我猜 VS 不识别.coder=NULL样式语法。我还编写了一个函数(而不是宏),在其中我像这样用 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 编译器(建议使用 GCC 编译器,例如 Cygwin 或 MinGW),要么放弃复合文字和指定初始化程序的便利。

功能版本应该可以正常工作。您可以通过打印出初始化结构来检查您是否已初始化所有内容。我假设在函数定义和它在分配给temp.

于 2013-03-15T06:41:02.000 回答
2

基本问题是LZMA_NEXT_CODER_INIT用于初始化结构,而next指向结构的指针。要将其初始化为 NULL,只需执行以下操作:

next = NULL

此外,Visual C++ 无论如何也不支持这种初始化,因为它是在 C99 中引入的,Visual Studio 不支持。要解决此限制,您可以使用 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 回答