【发布时间】:2019-06-20 07:28:54
【问题描述】:
我正在为realloc 编写一个包装器。对于返回值,我使用这个:
typedef enum { SALLOC_OK, SALLOC_OVERFLOW, SALLOC_ALLOCFAIL, ... } salloc_rc;
在这样的函数中使用:
salloc_rc salloc(<args>) {
if(blabla) return SALLOC_OVERFLOW;
if(blabla) return SALLOC_ALLOCFAIL;
/* More error codes */
return SALLOC_OK;
}
这当然不是完整的代码,但足以说明我想要什么。到目前为止,一切都很好。我可以像这样检查返回值:
if(salloc(a,b) != SALLOC_OK) // Handle error
或者如果我想更精确:
if(salloc(a,b) == SALLOC_OVERFLOW) // Handle overflow
但是,我希望这与检查错误的常用方法兼容。我希望能够使用:
if(!salloc(a,b)) // Handle error
和
if(salloc(a,b) { /* Do stuff */ }
else { /* Handle error */ }
这里的问题是 0 是假的,而其他一切都是真的。我想做的事情似乎是不可能的,但可能有一些我错过的方法。到目前为止,我发现的唯一解决方案是给函数一个额外的参数,其中包含一个指向我可以存储错误代码的位置的指针,但如果可能的话,我想避免这种情况。
TL;DR
如何使函数<type> foo() 能够根据出现的问题返回不同的错误消息,同时仍然保持以“传统”方式检查错误的可能性,例如
if (!foo()) exit(EXIT_FAILURE);
【问题讨论】:
-
我更喜欢
if(salloc(a,b) != SALLOC_OK)。它更明确,并使您的意图更清晰。如果不让事情变得比这更复杂、更不清晰,就没有办法让零意味着不止一件事。 -
旁白:请注意,当
realloc()返回NULL时,这本身并不意味着realloc()失败。realloc(ptr, 0)是一个潜在的有效(非内存不足)响应。我明白你为什么想要realloc()的包装器。 -
"可能在 C 中返回不同的 "false"?"当然 - 返回 0.0 或 -0.0,两者都是错误的,并且当支持
-0.0时,两者都可以是 discerned - 但我认为 FP 答案在这里不是一个好方法。 -
@chux 不错,但我希望能够区分两个以上不同的错误。
-
@Broman ????抱怨,抱怨next 4 will be wanted,抱怨,抱怨,抱怨。
标签: c return return-value