我试图获得一个用原装c编译器(MS VS2012)编译的C90示例。
在protobuf-c源代码中,有两种特定于C99的东西可以很容易地更改为与C90兼容,即在作用域中间的变量声明(在C90中不允许)和通过.-syntax (例如some_struct_type name = {.a=1,.b=2})实现的结构实例化。
我现在只剩下一个编译错误。源文件'protobuf-c.c‘中的相应行如下:
void *array = *(void **) member + siz * (*p_n);其中member定义为void *,p_n定义为size_t *。而相应的错误是
error C2036: 'void *' : unknown size请注意,对于protobuf-c版本1.0.1 (参见各自源代码,第2404行),这是有效的。此行已在版本1.0.2中更改为
void *array = *(char **) member + siz * (*p_n);用这句话。因此,更改行将消除编译错误。
我的问题是:
*(char **)版本吗?(出于其他原因,我想坚持使用Protobuf-c1.0.1)
发布于 2014-10-21 14:04:03
作为member传递的参数是指向char指针的指针的地址。首先,转换和延迟获得该指针。(传递指针的地址,以便在函数中更改指针。)
加法siz * (*p_n)增加指向正确元素的指针。
整行可以改写为:
char** pm = member ;
char* m = *pm ;
void *array = m + siz * (*p_n);从void*更改为char*,这样指针算术是可能的,因为C Standard不允许在空指针上使用指针。错误消息告诉您,对象void*所指向的对象的大小是未知的,因此必须使用char*指针。
只要传递给函数的对象具有char**类型,就可以切换到char**版本。
发布于 2014-10-21 14:03:53
I would like to understand this line of code.
代码生成指针算法并试图隐藏详细信息。因此,它在任何地方都使用void,指针不被延迟。假设sizeof (*(void*))等于1。
Can I switch to the *(char **) version?
是的,因为代码分配结果指针,而不取消指针。
What is the error message telling me?
这个黑客是编译器特有的。您的编译器没有取消这一点,它没有提供void*目标的大小。
您应该使用“可移植”版本。对于大多数编译器来说,sizeof(char)是一个,对于这些编译器来说,它是可移植的。
https://stackoverflow.com/questions/26488432
复制相似问题