结构的宏

时间:2013-03-15 06:33:50

标签: c macros struct

我有一个结构

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

主要目的是用NULL初始化next结构。

但我在第210行收到error 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();

错误现在消失但我得到了运行时崩溃。我做得对吗?接下来真的用NULL初始化了吗?或者我搞砸了?

由于

2 个答案:

答案 0 :(得分:4)

错误消息的格式就像它们来自MSVC一样。 MSVC不支持C99;您使用的构造是在C99而不是C89,这是MSVC支持的所有。

您需要找到一个C99编译器(建议使用GCC编译器,如Cygwin或MinGW)或放弃复合文字和指定初始值设定项的便利性。

功能版本应该可以正常工作。您可以通过打印初始化结构来检查是否已初始化所有内容。我假设函数定义与其在temp的赋值中的使用之间存在其他代码。

答案 1 :(得分: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;
}