void examine_data(const char *ptr, size_t len)
{
...
}
char *p = ...;
size_t l = ...;
examine_data(p, l);
这不是问题。唯一的问题在于,您必须与同事一致同意参数的顺序,以便在所有函数中使用相同的约定。
但是当你想要返回相同类型的信息时会发生什么呢?通常会得到类似以下内容:
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
这种做法看起来没问题,但实际上存在很多问题。返回值应该是一个返回值,但是在这个实现中却不是。从以上内容中我们无法得知函数get_data
不能查看len
指向的内容。而且编译器也没有检查返回值是否通过指针正确地返回。因此,下个月当有人不理解代码就进行修改(可能是因为他没有阅读文档?)时,在没有引起注意的情况下就会出现故障或者随机崩溃。
因此,我提出的解决方案是使用简单的结构体。
struct blob { char *ptr; size_t len; }
这些示例可以重写为:
void examine_data(const struct blob data)
{
... use data.tr and data.len ...
}
struct blob = { .ptr = ..., .len = ... };
examine_data(blob);
struct blob get_data(void);
{
...
return (struct blob){ .ptr = ...data..., .len = ...len... };
}
struct blob data = get_data();
由于某种原因,我认为大多数人会本能地使examine_data
函数接受一个指向结构体blob的指针,但我不知道为什么会这样。它仍然接受一个指针和一个整数,只是更清晰地表明它们在一起。而在get_data
的情况下,无法像之前描述的那样搞砸,因为没有长度的输入值,必须返回一个长度。
gettimeofday
),但实际上使用指针代替,人们就把这个当成了例子。 - zwol