C ++检查返回码

是否值得检查不应失败的方法的返回码? 例如,我通常会这样做:
char buf[MAXBUF];
snprintf(buf, sizeof(MAXBUF), "%s.%d", str, time);
即使我知道,检查snprintf的返回码也是一种好习惯 MAXBUF足够大我的目的?这样做似乎很有意义 即使代码变得更加冗长。     
已邀请:
简答:是的 长答案:是的,因为它捕获了如下的愚蠢错误。
char buf[MAXBUF];
snprintf(buf, sizeof(MAXBUF), "%s.%d", str, time);

// sizeof(MAXBUF) is probably equal to sizeof(int)
C代码的主要问题是人们实际上没有检查返回代码(因为他们认为代码永远不会失败)。所以故事的寓意是不要假设和检查。它实际上并没有给代码增加太多。你可能应该退出/中止,如果不应该出错的东西实际出错,那么你会在测试周期的早期找到它们。 C ++解决方案:
std::stringstream  buf;
buf << str << "." << time;  // No chance of error as compiler does the work.
    
这取决于。是否有可能
MAXBUF
或格式字符串或输入值将来会发生变化?如果呼叫失败,您的代码可以采取什么现实的行动?答案完全取决于您的申请。 一种可能性是简单地
assert
返回值与预期一致,而不是默默地失败。在生产版本中,这将不会花费你任何费用,并且会对源代码的冗长程度增加很少。     
这可能是最好的,只是因为,但如果你确定MAXBUF的大小永远不会超过那么它只会增加几个时钟周期。     
在编写代码时,您正在权衡一次简单错误检查的一次性成本,而不是根据上下文决定是否检查它的重复成本,如果没有,可能由于误解的假设或其他人的后续维护而导致生产错误。 在大多数情况下,这是毫无疑问的。     
如果缓冲区在某种程度上太小,那么字符串将被截断。您希望您的测试能够捕获这一点,因为您将产生不正确的结果。 然后,检查返回值不需要添加太多冗长。正如奥利所说,
assert
很便宜:
int result = snprintf(buf, sizeof buf, "%s.%d", str, time);
assert(result >= 0 && result <= (sizeof buf) - 1);
说实话,我不会总是检查,但这取决于为什么我认为
str
不能那么久。如果这是一个非常根本的原因(比如它是来自
dirent
结构的文件名,而
MAXBUF
是用
MAX_FILENAME
定义的),那么我可能不会打扰。如果这是因为在其他地方有一些检查,或者调用者有责任传入一个只有一定长度的字符串,那么它可能是一个想法
assert
,只是因为某天有可能抓住别人的错误。显然,如果
str
是任何一种未经检查的外部输入,那么测试是必不可少的。     

要回复问题请先登录注册