C表示功能故障的方法

C表示功能故障的方法,c,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,

我有一系列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);
那么:

int find_uint32(uint8_t id, uint32_t *val);
您传递一个指向结果的指针,并返回
0
表示成功,返回
!=0
表示错误

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

uint32_t *find_uint32(uint8_t id);

没有一种方法可以实现这一点,但典型的解决方案是:

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


我通常不鼓励这种做法,其基本原理是,与显式返回错误标志相比,神奇的错误号会使代码更难读取和维护。

但是,调用方失去了简单调用查找uint32(tofind)的便利性-但随后必须将误差指示器作为参数传递,所以我猜它是秋千和环形交叉口。绝对。最后,归结到函数是如何使用的。@ Pycthon:C语言缺少C++和java语言的异常功能。