我有一个结构
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初始化了吗?或者我搞砸了?
由于
答案 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;
}