Я пытаюсь найти, какой заголовок включать для функции strerrorlen_s
из C11 standard в 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());
В документации представлены следующие слова:
Как и во всех проверенных границах функциях, strerror_s и strerrorlen_s гарантируются только в том случае, если
__STDC_LIB_EXT1__
определяется реализацией, и если пользователь определяет__STDC_WANT_LIB_EXT1__
для целочисленной константы1
, прежде чем включать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?