gpt4 book ai didi

c++ - MSVC 2017 下缺少 C11 strerrorlen_s 函数

转载 作者:IT老高 更新时间:2023-10-28 22:59:38 27 4
gpt4 key购买 nike

我正在尝试从 C11 standard 中为 strerrorlen_s 函数查找要包含的 header MSVC 2017 下。我需要它来为使用 strerror_s 获得的错误消息分配空间。代码如下:

auto size = strerrorlen_s(errno) + 1;
char* errorReason = (char*)alloca(size);
strerror_s(errorReason, size, errno);
std::ostringstream oss;
oss << "Cannot open: " << fileName << " Reason: " << errorReason;
throw std::runtime_error(oss.str());

在文档中有以下文字:

As with all bounds-checked functions, strerror_s and strerrorlen_s are only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including string.h.

MSVC 2017 没有定义 __STDC_LIB_EXT1__ 似乎在包含 string.h 之前定义 __STDC_WANT_LIB_EXT1__ 没有没有效果。虽然 strerror_s 可用。

  • strerrorlen_sWindowsMSVC 2017 下是否可用?
  • 如果该功能不可用,是否可以通过其他方式获取错误消息长度?
  • strerror_s 线程在 Windows 下是否安全,因为在 Linux 下似乎不是,strerror_r如果需要线程安全,则必须使用它,但在 Windows 上不可用?

最佳答案

Microsoft Visual Studio 在用作 C 编译器时,主要遵循 1990 版本的 C 标准。最近有人尝试将其更新为 1999 年版本的语言。他们仍然远远落后 - 编译器与 2011 版本相去甚远。如果您需要符合标准的 C 编译器,则不能使用 VS。

此外,您似乎在 C++ 模式下使用编译器,这并不完全有助于符合 C 标准...C11 和 C++11 并不总是兼容。

话虽如此,您要求的功能是可选边界检查接口(interface)的一部分,我相信编译器很少(如果有的话)已经实现了它。边界检查接口(interface)中存在的一些功能在 VS 之前的 C11 中作为非标准扩展存在。它们不一定符合标准。

不保证库函数是可重入的。它们可能是线程安全的,也可能不是线程安全的。

关于c++ - MSVC 2017 下缺少 C11 strerrorlen_s 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44430141/

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