在MSVC 2017下缺少C11 strerrorlen_s功能

bob*_*eff 13 c++ tr24731 visual-studio

我正试图在MSVC 2017下找到C11标准中包含的strerrorlen_s功能头.我需要它来为错误消息分配空间.代码如下: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());
Run Code Online (Sandbox Code Playgroud)

在文档中有以下字样:

与所有边界检查函数一样,如果__STDC_LIB_EXT1__由实现定义并且用户在包含之前定义__STDC_WANT_LIB_EXT1__整数常量1,则仅保证strerror_s和strerrorlen_s可用string.h.

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

  • strerrorlen_s在现有的WindowsMSVC 2017年
  • 如果函数不可用,是否有可能通过其他方式获取错误消息长度?
  • strerror_sWindows下是否是线程安全的,因为在Linux下它似乎不是并且如果需要线程安全必须使用strerror_r,但它在Windows上不可用?

Lun*_*din 13

当用作C编译器时,Microsoft Visual Studio大多遵循1990版本的C标准.最近已经进行了一些尝试以将其更新为该语言的1999版本.他们仍远远落后于此 - 编译器远不及2011版本.如果您需要符合标准的C编译器,则无法使用VS.

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

话虽这么说,你要求的功能是可选的边界检查界面的一部分,我相信很少,如果有的话,编译器还没有实现.边界检查接口中存在的一些函数在VS之前的C11中作为非标准扩展存在.它们不一定符合标准.

无法保证库函数是可重入的.它们可能是也可能不是线程安全的.

  • @bobeff 如果您使用 GCC,运行时可能支持 `%m` printf 标志。您可以使用 `snprintf(buf, size, "%m")`。 (2认同)