【发布时间】:2017-11-14 15:51:04
【问题描述】:
我正在制作一个数据结构库。我允许用户调用的一项功能是:
unsigned int index(struct myDataStructure, void* value);
它搜索我的数据结构并返回该值所在的index 位置。
例如
{ 'A', 'D', 'C' }
char val1 = 'A';
unsigned int location = index(s, &val1); // location = 0
char val2 = 'C';
location = index(s, &val2); // location = 2
如果列表中不存在该元素,那么我不知道要返回什么。以下是我目前排除的选项:
- 使用
Assert或系统退出或异常来结束运行时。我认为这不会有太大用处,因为用户必须调用contains以确保该元素在调用index()之前在结构中 - 返回 UINT_MAX 或 0
- 将返回类型更改为
long,这样我就可以返回-1。我不想切换数据类型。 - 让用户传入
**unsigned int,这样我就可以将它指向NULL(如果不存在)或一个真正的索引值。这对于阅读我的 API 的人来说并不友好。
我的最佳解决方案是:
// Change return type to pointer.
unsigned int* index(struct myDataStructure, void* value)
{
static int val;
if (value exists...)
{
val = correct index value
return &val;
}
else
{
return NULL;
}
}
但是我还是觉得这个解决方案很差。
【问题讨论】:
-
您可以将指针传递给存储错误值的变量:
unsigned int index(struct myDataStructure, void* value, int *status);。 -
您也可以考虑使用 POSIX
ssize_t类型而不是unsigned。ssize_t与size_t的宽度相同,但保证能够保持-1的值。
标签: c function error-handling