geo*_*org 6 c c99 protocol-buffers c89
我正在尝试使用C90编译器(MS VS2012)编译protobuf-c示例.
在protobuf-c源代码中,有两个C99特定的东西可以很容易地改变为与C90兼容,即在范围中间的变量声明(C90中不允许)和通过-syntax 实例化结构.(例如some_struct_type name = {.a=1,.b=2}) .
我现在卡住了一个编译错误.源文件'protobuf-cc'中的相应行读取:
void *array = *(void **) member + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)
哪里member是定义为void *和p_n作为size_t *.各自的错误是
error C2036: 'void *' : unknown size
Run Code Online (Sandbox Code Playgroud)
请注意,这对protobuf-c版本1.0.1有效(请参阅相应的源代码,第2404行).此行已在版本1.0.2中更改为
void *array = *(char **) member + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)
有这个评论.因此更改行会消除编译错误.
我的问题是:
*(char **)版本吗?(出于其他原因,我想坚持使用protobuf-c 1.0.1)
传递的参数member是指向 char 指针的指针的地址。首先,强制转换和引用获取该指针。(传递指针的地址,以便可以在函数中更改指针。)
添加操作siz * (*p_n)会增加指向正确元素的指针。
整行代码可以重写为:
char** pm = member ;
char* m = *pm ;
void *array = m + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)
从 void* 更改为 char* 以便可以进行指针算术,因为 C 标准不允许在 void 指针上进行这种算术。错误消息告诉您, void* 指向的对象的大小未知,因此您必须使用 char* 指针。
只要传递给函数的对象具有char**您可以切换到 char** 版本的类型。
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |