C方式表示功能失效

时间:2012-06-30 15:57:43

标签: c

我有一系列C函数:

const char* find_string(uint8_t id);
int32_t find_int32(uint8_t id);
uint32_t find_uint32(uint8_t id);
uint64_t find_uint64(uint8_t id);

返回找到的项目(在链表中)。对于字符串,我可以返回一个空字符串。但是对于整数值,我想指出是否找到了积分值。 C语言的用法是什么?

像这样:?

uint32_t find_uint32(uint8_t id, int* success);

2 个答案:

答案 0 :(得分:9)

没有办法实现这一目标,但典型的解决方案是:

int find_uint32(uint8_t id, uint32_t *result)

让函数返回状态代码而不是结果。实际结果通过指针“返回”。虽然这里的意见不同,但是在失败时让函数返回零可能是一个好主意,这样你就可以做以下事情:

if (!find_uint32(42, &out)) {
    /* error */
}

反之亦然的一个原因,即通过指针参数返回状态代码,结果作为函数的返回值,如果错误是,您可以允许将NULL传递给状态代码被忽略。这样,如果您出于某种原因不必担心错误,那么您的代码将更具可读性;考虑:

uint32_t val = find_uint32(42, NULL /* don't care */);

在某些情况下,您可以将“魔术值”保留为错误指示符。正如您所提到的,NULL指针适用于字符串。如果您确定某个整数值永远不是有效结果,则可以让它指示错误。例如,如果你有一个返回无符号值的函数,它永远不会超过0x7FFFFFFF,你可以让第31位指示错误,剩下的31位用于携带数据或错误代码取决于值最高位。

我通常会劝阻这种做法,理由是魔术错误数字会使代码更难以阅读和维护,而不是显式返回错误标记。

答案 1 :(得分:1)

怎么样:

int find_uint32(uint8_t id, uint32_t *val);

您传递指向结果的指针并返回0表示成功,并!= 0表示错误。

如果您喜欢在表达式中使用find_uint32的便利性,您还可以返回指向元素的指针(或指向节点的链接列表)。您需要取消引用指针才能访问该值,但您也可以在结果指针中使用NULL来指示错误:

uint32_t *find_uint32(uint8_t id);