2012-06-30 21 views
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); 
+3

@pyCthon:** C ** ... –

+0

@JeffMercado好点 – pyCthon

+0

@pyCthon:C语言缺少C++和Java等语言的异常工具。 –

回答

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位保留数据或错误代码,具体取决于最高位的值。

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

+0

但是,然后调用者失去了一个简单的调用find_uint32(tofind)的方便 - 但随后将不得不通过错误指示器作为参数,所以我猜它是摆动和回旋。 –

+1

绝对如此。最后,它涉及到如何使用该功能。 –

1

什么:

int find_uint32(uint8_t id, uint32_t *val); 

你一个指针传递给结果和错误返回0成功和!= 0

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

uint32_t *find_uint32(uint8_t id);