【发布时间】:2014-10-21 13:52:52
【问题描述】:
我正在尝试使用 C90 编译器 (MS VS2012) 编译 protobuf-c 示例。
在 protobuf-c 源代码中,有两个 C99 特定的东西可以很容易地更改为与 C90 兼容,即作用域中间的变量声明 (not allowed in C90) 和 instantiation of structs 通过. -语法(例如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 有效(参见 respective source code,第 2404 行)。此行在 1.0.2 版本中已更改为
void *array = *(char **) member + siz * (*p_n);
this comment。 相应地更改行消除了编译错误。
我的问题是:
- 我想了解这行代码。
- 我可以切换到
*(char **)版本吗? - 错误消息告诉我什么?
(出于某些其他原因,我想坚持使用 protobuf-c 1.0.1)
【问题讨论】:
-
看起来它被设计成人类无法阅读的。 :)
-
有些编译器将 void* 与 BYTE* 类似,至少在指针运算中如此。即 sizeof(void*) 编译为 1。我会将这条杂乱的线拆分为它的元素,并将
void*替换为char*用于指针算术的特定目的。 -
@harper 如果代码“整理”后会读到什么
-
一个好的执行方法是让您使用它的
char版本并使用临时变量一个接一个地定义相同的计算。void*版本只是 gcc'ish 垃圾。void*算术是一个没有多大意义的扩展。
标签: c protocol-buffers c99 c89