【发布时间】:2013-11-15 14:28:56
【问题描述】:
我刚刚在工作中遇到了另一个代码库,开发人员在复制/比较/设置时始终使用结构的第一个元素的地址,而不是结构本身。这是一个简单的例子。
首先有一个结构类型:
typedef struct {
int a;
int b;
} foo_t;
然后有一个函数可以复制这样一个结构:
void bar(foo_t *inp)
{
foo_t l;
...
memcpy(&l.a, &inp->a, sizeof(foo_t));
...
}
我自己不会以这种方式编写对memcpy 的调用,我一开始怀疑最初的开发人员根本没有完全掌握 C 中的指针和结构。但是,现在我已经在两个方面看到了这一点不相关的代码库,没有共同的开发者,所以我开始怀疑自己了。
为什么要使用这种风格?
【问题讨论】:
-
下面的答案都没有真正增加我对 C 的了解,这正是我所希望的 ;)
-
这非常有用,特别是当多种类型的结构以相同的第一个元素开头时,作为一种伪继承。 CPython 代码库大量使用
PyObject;所有 Python 对象都以PyObject成员开头,并且它们通常使用PyObject *指针传递,因此您不必对正在使用的对象的实际类型进行硬编码。 -
如果这是最后一个参数,
memcpy就会变得安全:sizeof(foo_t) - offsetof(foo_t, a)。 -
当我第一次掌握 C 结构和数组的窍门时,我做了很多这样的事情。我猜你对它发生的原因的看法几乎是正确的。
-
我会从没有一个名为
l的单字母变量开始。