2

我有一系列 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);
4

2 回答 2

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 位根据最高位的值携带数据或错误代码。

我通常不鼓励这种做法,理由是神奇的错误编号会使代码比显式返回错误标志更难阅读和维护。

于 2012-06-30T16:00:22.297 回答
1

关于什么:

int find_uint32(uint8_t id, uint32_t *val);

您传递一个指向结果的指针并返回0成功和!= 0错误。

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

uint32_t *find_uint32(uint8_t id);
于 2012-06-30T15:59:46.400 回答