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在现有的Windows与MSVC 2017年?strerror_s在Windows下是否是线程安全的,因为在Linux下它似乎不是并且如果需要线程安全必须使用strerror_r,但它在Windows上不可用?Lun*_*din 13
当用作C编译器时,Microsoft Visual Studio大多遵循1990版本的C标准.最近已经进行了一些尝试以将其更新为该语言的1999版本.他们仍远远落后于此 - 编译器远不及2011版本.如果您需要符合标准的C编译器,则无法使用VS.
此外,您似乎在C++模式下使用编译器,这并不完全有助于C标准符合... C11和C++ 11并不总是兼容.
话虽这么说,你要求的功能是可选的边界检查界面的一部分,我相信很少,如果有的话,编译器还没有实现.边界检查接口中存在的一些函数在VS之前的C11中作为非标准扩展存在.它们不一定符合标准.
无法保证库函数是可重入的.它们可能是也可能不是线程安全的.
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |