在我的代码中的某些地方,我打印这样的调试消息:
int ret = getLinkSpeed(device.getSysName(), linkSpeed);
if (ret < 0)
{
logDebug("Failed to obtain port speed for this device. Error: " + std::string(strerror(errno)));
}
从documentation开始,并不完全清楚strerror在某些条件下是否会返回0(这会导致我的代码崩溃)。有谁知道它是否安全?
答案 0 :(得分:11)
为什么不写一个函数来执行此操作:
string ErrStr() {
char * e = strerror(errno);
return e ? e : "";
}
这很容易使用,自我记录,可以适应重新格式化输出,并涵盖strerror()可能返回NULL的可能性(我不知道是否可以)。
答案 1 :(得分:3)
好问题(+1),文档似乎很模糊。我不确定是否存在“更难”的来源,例如POSIX规范。
有点务实地思考,here是GNU libc的实现。它返回一个指向静态字符串缓冲区的指针,因此它不能返回0.
在回应p00ya的评论时,面对冲突,模糊或不完整的规范,安全(也是非常实用,嘿)的事情当然是假设最坏的, not 假设返回值始终是有效字符串。
答案 2 :(得分:3)
如果您使用多线程应用程序,可能会遇到问题。在这种情况下,您需要使用strerror_r