【发布时间】:2016-01-26 16:00:34
【问题描述】:
我正在浏览 Linaro ODP 框架,看到这段代码 sn-p,
static int find_block(const char *name, uint32_t *index)
{
uint32_t i;
for (i = 0; i < ODP_CONFIG_SHM_BLOCKS; i++) {
if (strcmp(name, odp_shm_tbl->block[i].name) == 0) {
/* found it */
if (index != NULL)
*index = i;
return 1;
}
}
return 0;
}
在这里,我们可以返回i 的值,而不是更新*index,以实现与下面相同的功能。
static int find_block(const char *name)
{
uint32_t i;
for (i = 0; i < ODP_CONFIG_SHM_BLOCKS; i++) {
if (strcmp(name, odp_shm_tbl->block[i].name) == 0) {
/* found it */
return i;
}
}
return -1;
}
除了品味、风格和编码指南之外,还有什么客观原因可以说明为什么必须选择其中一个而不能选择另一个?
【问题讨论】:
-
该函数已经返回一个布尔结果。除了通过指针参数之外,您还能将另一个值传递给调用者吗?
-
您可能会返回索引值,或类似 -1 的“未找到”。然后,您需要根据返回的值在代码中进行分支。这就是许多 UNIX 系统调用的作用。
-
这显然是一个只有内部链接的函数(参见
static)。看看调用它的代码,这可能解释了这个选择。 -
合理的问题,并不完全基于意见,所以近距离投票是错误的——在我看来;-)。显然,正如在 cmets 中发生的那样,人们可以讨论(目标!)赞成和反对的原因。我今天看到了很多更糟糕的问题,我很高兴看到并讨论这个问题。
-
在第一个函数中,返回的索引是一个无符号整数。没有办法让它返回一个负值来表示失败。第二个函数只是将用于 int 的类型更改为 int,因此如果要查找的索引优于 INT_MAX,它的行为将无法预测。
标签: c return-value diagnostics