gpt4 book ai didi

C++ 相当于 perror?

转载 作者:可可西里 更新时间:2023-11-01 16:47:33 27 4
gpt4 key购买 nike

据我所知,我处理流错误的两个选项是 perror 和流异常。这两种选择都是不可取的。原因如下:

错误

  • std::strerror 返回实现定义的消息。此消息并不总是对所有系统有用

  • std::strerror 不是线程安全的

  • std::strerror 返回的指针可以失效

  • 从技术上讲,C 库在 C++ 中已“弃用”。几乎总是有一个 C++-ish 等价物。当有潜在的 C++ 等价物时,我没有理由必须依赖 POSIX 和 C

流异常

  • 异常(exception)情况并非适用于所有程序

  • 虽然 std::strerror 有时可以提供有用的错误消息,但流异常从不 提供有用的错误消息。对于 f.exceptions(f.failbit),对于打开文件失败或提取失败,抛出的异常是 std::ios_base::failurewhat() 是“basic_ios::clear”。

系统错误

std::ios_base::failure 替换为 std::system_error 会产生完全相同的结果。如果我们看一下N2769: Detailed Reporting for Input/Output Library Errors (Revision 2) ,我们可以看出原因:

When throwing ios_base::failure exceptions, implementations are encouraged to provide values of ec that identify the specific reason for the failure. [Note - Errors arising from the operating system would typically be reported as system_category errors with an error value of the error number reported by the operating system. Errors arising from within the stream library would typically be reported as error_code(ioerrc::stream, iostream_category) -- end note].

The above wording provides only normative encouragement for implementers to do the right thing, and thus relies on market forces and the good intensions of implementers to produce results useful to users. Anything stronger (such as changing "are encouraged to" to "shall") would require much additional specification and is beyond the scope of what the LWG can realistically tackle for C++0x.

另一种方法是可能依赖庞大的第三方库(我正在看你的 Boost)或手动滚动它(除非你知道自己在做什么,否则你永远不想这样做。)我正在寻找 C++ 标准库的方法来做到这一点。有吗?

最佳答案

我不同意你的观点

perror et alii are member of C standard library and as such technically deprecated(*).

即使在 cplusplus.com 上,如果不是官方文档来源,我也会看到错误号:

C++11 expands the basic set of values required to be defined in this header... In C++, errno is always declared as a macro, but in C it may also be implemented as an int object with external linkage.

我对那些句子的理解是errno仍然在C++11中被考虑!

以后还能看到

Libraries that support multi-threading shall implement errno in a per-thread basis: With each thread having its own local errno. This is a requirement in libraries compliant with C11 and C++11 standards.

这意味着即使 strerror() 不是线程安全的,errno 在任何 C++11 兼容实现中也是如此。

现在由您在同步函数中使用 std::strerror(例如使用互斥锁保护)来构建 std::string,如果您喜欢。但是无论如何,即使关于 strerror 的每个文档都声明它使用可以被覆盖的静态缓冲区(这就是 Posix 1 定义 strerror_r 的原因),我也找不到关于 perror 的任何警告> 不是线程安全的。

(*) 我的观点是,只要 OO 和模板可以提供更好的界面(iostream 与 stdio.h 或字符串与 string.h),C 库的元素是 < em>被 C++ 库中的其他人替换。但是当没有什么可以添加时(cerrno、cmath、csignal 等),C 标准库中的函数只是简单地包含在 C++ 库中。

关于C++ 相当于 perror?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32756329/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com