【发布时间】:2017-11-09 20:08:47
【问题描述】:
我正在尝试从 MSVC 2017 下的 C11 standard 中为 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());
在文档中有以下文字:
与所有边界检查函数一样,只有在实现定义了
__STDC_LIB_EXT1__并且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,才能保证strerror_s 和strerrorlen_s 可用。
MSVC 2017 没有定义__STDC_LIB_EXT1__,似乎在包含string.h 之前定义__STDC_WANT_LIB_EXT1__ 没有效果。虽然strerror_s 可用。
-
strerrorlen_s在 Windows 和 MSVC 2017 下是否可用? - 如果该功能不可用,是否可以通过其他方式获取错误消息长度?
-
strerror_s线程在 Windows 下是安全的,因为在 Linux 下似乎不是,如果需要线程安全,必须使用 strerror_r,但是它在 Windows 上不可用?
【问题讨论】:
-
你也缺
getline()吗? -
@Badda 没有
getline可用。 -
@Aconcagua
RSIZE_MAX宏的值为2147483647。为错误消息分配这样的内存是非常不切实际的。 :) -
@bobeff Truth - MinGW 似乎没有提供它(至少我在任何地方都找不到它......)并且我假设了一些更有意义的价值。来自here,我发现了它的真正含义。作为主要的 C++ 开发人员(rsize_t 实际上不是那里标准的一部分),我不太了解这个新的 C11 特性。很抱歉给了不好的建议...
-
你为什么不能简单地做
oss << "Cannot open: " << fileName << " Reason: " << strerror(errno);?
标签: c++ visual-studio tr24731